jtr/DevDisciples.Json.Tools/Json2CSharpTranslator.cs
mdnapo 78ebafb409 - Added debounce time to requests from frontend
- Made editors full height & full width
- Applied ParsingException more consistently
2024-09-17 21:16:24 +02:00

44 lines
1.6 KiB
C#

using DevDisciples.Json.Parser;
using DevDisciples.Parsing;
using Humanizer;
namespace DevDisciples.Json.Tools;
public static partial class Json2CSharpTranslator
{
public static readonly VisitorContainer<ISyntaxNode, ITranslation> Visitors;
static Json2CSharpTranslator()
{
Visitors = new();
Visitors.Register<JsonObject>(JsonObjectTranslator.Translate);
Visitors.Register<JsonArray>(JsonArrayTranslator.Translate);
Visitors.Register<JsonString>(JsonStringTranslator.Translate);
Visitors.Register<JsonNumber>(JsonNumberTranslator.Translate);
Visitors.Register<JsonBool>(JsonBoolTranslator.Translate);
Visitors.Register<JsonNull>(JsonNullTranslator.Translate);
}
public static string Translate(string source, Context? context = null)
{
if (JsonParser.Parse("<source>", source) is not JsonObject root)
throw new ParsingException("Expected a JSON object.");
context ??= new();
var visitor = Visitors[typeof(JsonObject)];
visitor(root, context, context.RootClassName);
context.Builder.Append("//using System;\n");
context.Builder.Append("//using System.Collections.Generic;\n");
context.Builder.Append('\n');
context.Builder.Append($"namespace {context.Namespace};\n\n");
context.Classes.ForEach(@class => @class.Translate(context));
return context.Builder.ToString();
}
private static Context ContextFromArgs(object[] args) => (args[0] as Context)!;
private static string NameFromArgs(object[] args) => ((string)args[1]).Camelize();
}