From 19d2cba440f8cf5f13f7009f330d90e8576e4d82 Mon Sep 17 00:00:00 2001 From: Zontreck Date: Mon, 28 Aug 2023 23:30:34 -0700 Subject: [PATCH] Add a JSON to C# code transformer : Bottle --- source/Bottle/Program.cs | 220 +++++++++++++++++++++++++++++++++++ source/Bottle/prebuild.xml | 1 - source/Prebuild/prebuild.xml | 3 +- source/SnapWrap/prebuild.xml | 3 +- 4 files changed, 222 insertions(+), 5 deletions(-) create mode 100644 source/Bottle/Program.cs diff --git a/source/Bottle/Program.cs b/source/Bottle/Program.cs new file mode 100644 index 0000000..38fac27 --- /dev/null +++ b/source/Bottle/Program.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Threading; + +namespace Bottle +{ + public class Program + { + private static void Usage() + { + Console.WriteLine("Bottle\nJson to C# transformer\n\nBottle [JsonFile] [OutputFile]"); + } + public static void Main(string[] args) + { + if(args.Length == 0 && File.Exists("test.json")) + { + args = new[] { "test.json", "test.cs" }; + } + if(args.Length != 2) + { + Usage(); + return; + } + string rawText = ""; + string file2 = args[1]; + + if (File.Exists(args[0])) + { + rawText = File.ReadAllText(args[0]); + + JsonObject node = JsonObject.Parse(rawText).AsObject(); + + Console.WriteLine("Preparing to parse..."); + if (File.Exists(file2)) File.Delete(file2); + Thread.Sleep(1000); + + MirrorWriter bw = new MirrorWriter(); + + bw.WriteLine($"using System;"); + + bw.WriteLine(); + + // Retrieve namespace name, first value in json + var ns = node["namespace"].AsValue(); + bw.WriteLine($"namespace {ns}"); + bw.WriteLine("{"); + + loop(node["data"], bw, 1); + + + bw.WriteLine("}"); + + + File.WriteAllText(file2, bw.GetStringBuilder().ToString()); + + }else + { + Console.WriteLine("> FILE NOT FOUND <"); + } + } + + public static void loop(JsonNode? node, StringWriter writer, int indent = 0) + { + foreach (KeyValuePair kvp in node.AsObject()) + { + if(kvp.Value is JsonValue value) + { + writer.WriteLine(doPutValue(kvp.Key, value, indent)); + } else if(kvp.Value is JsonObject obj) + { + writer.WriteLine($"{indents(indent)}public static class {kvp.Key}"); + writer.WriteLine(indents(indent)+"{"); + + loop(obj, writer, indent+1); + + writer.WriteLine(indents(indent)+"}"); + } + } + } + + public static string indents(int count) + { + return "".PadLeft(count*4); + } + + public static string doPutValue(string key, JsonValue value, int indent) + { + StringBuilder builder = new(); + + if (value.TryGetValue(out int int1)) + { + builder.AppendLine($"{indents(indent)}public static readonly int {key} = {int1};"); + } else if (value.TryGetValue(out string str1)) + { + builder.AppendLine($"{indents(indent)}public static readonly string {key} = \"{str1}\";"); + } else if (value.TryGetValue(out bool bool1)) + { + builder.AppendLine($"{indents(indent)}public static readonly bool {key} = {bool2String(bool1)};"); + } else if (value.TryGetValue(out float f1)) + { + builder.AppendLine($"{indents(indent)}public static readonly float {key} = {f1}f;"); + } else if (value.TryGetValue(out double d1)) + { + builder.AppendLine($"{indents(indent)}public static readonly double {key} = {d1};"); + } else if (value.TryGetValue(out byte b1)) + { + builder.AppendLine($"{indents(indent)}public static readonly byte {key} = {b1};"); + } else if (value.TryGetValue(out long l1)) + { + builder.AppendLine($"{indents(indent)}public static readonly long {key} = {l1}L;"); + } + + return builder.ToString(); + } + + public static string bool2String(bool b) + { + if (b) return "true"; + return "false"; + } + } + + public class MirrorWriter : StringWriter + { + public static void w(object? val) + { + Console.Write(val); + } + + public override void Write(bool value) + { + base.Write(value); + w(value); + } + + public override void Write(char value) + { + base.Write(value); + w(value); + } + + public override void Write(decimal value) + { + base.Write(value); + w(value); + } + + public override void Write(double value) + { + base.Write(value); + w(value); + } + + public override void Write(float value) + { + base.Write(value); + w(value); + } + + public override void Write(int value) + { + base.Write(value); + w(value); + } + + public override void Write(long value) + { + base.Write(value); + w(value); + } + + public override void Write(char[] buffer, int index, int count) + { + base.Write(buffer, index, count); + w(buffer.Skip(index).Take(count).ToArray()); + } + + public override void Write(char[] buffer) + { + base.Write(buffer); + w(buffer); + } + + public override void Write(string value) + { + base.Write(value); + w(value); + } + + + public override void Write(uint value) + { + base.Write(value); + w(value); + } + + public override void Write(object value) + { + base.Write(value); + w(value); + } + + public override void Write(ulong value) + { + base.Write(value); + w(value); + } + + public override void Write(StringBuilder value) + { + base.Write(value); + w(value.ToString()); + } + } +} diff --git a/source/Bottle/prebuild.xml b/source/Bottle/prebuild.xml index 05360ff..ae4f1c5 100644 --- a/source/Bottle/prebuild.xml +++ b/source/Bottle/prebuild.xml @@ -22,7 +22,6 @@ - icon/Bottle.ico icon/Bottle.png diff --git a/source/Prebuild/prebuild.xml b/source/Prebuild/prebuild.xml index 3915a48..b662591 100644 --- a/source/Prebuild/prebuild.xml +++ b/source/Prebuild/prebuild.xml @@ -4,8 +4,6 @@ assemblyName="prebuild" icon="App.ico" type="Exe" - rootNamespace="Prebuild" - startupObject="Prebuild.Prebuild" version="2.0.10" > Matthew Holmes (matthew@wildfiregames.com) @@ -16,6 +14,7 @@ John Hurliman (john.hurliman@intel.com) WhiteCore build (2015) Rowan Deppeler (greythan@gmail.com) OpenSimulator build (2017) AJLDuarte + Tara Piccari The Prebuild project generator diff --git a/source/SnapWrap/prebuild.xml b/source/SnapWrap/prebuild.xml index e9b2486..c3c4e0d 100644 --- a/source/SnapWrap/prebuild.xml +++ b/source/SnapWrap/prebuild.xml @@ -4,8 +4,7 @@ type="Exe" version="1.0.1" icon="icon/SnapWrap.ico" - rootNamespace="dev.zontreck.snap" - startupObject="dev.zontreck.snap.Wrap"> + > Tara Piccari (tarapiccari@gmail.com) C# Prebuild Scripting for code generation