using DevDisciples.Json.Parser; using DevDisciples.Parsing; using Humanizer; namespace DevDisciples.Json.Tools; public static partial class Json2CSharpTranslator { public static readonly VisitorContainer Visitors; static Json2CSharpTranslator() { Visitors = new(); Visitors.Register(JsonObjectTranslator.Translate); Visitors.Register(JsonArrayTranslator.Translate); Visitors.Register(JsonStringTranslator.Translate); Visitors.Register(JsonNumberTranslator.Translate); Visitors.Register(JsonBoolTranslator.Translate); Visitors.Register(JsonNullTranslator.Translate); } public static string Translate(string source, Context? context = null) { if (JsonParser.Parse("", source) is not JsonObject root) throw new Exception("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(); }