- Made editors full height & full width - Applied ParsingException more consistently
44 lines
1.6 KiB
C#
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();
|
|
} |