From 81ba16a0d1a6ab2d2188540e0c25bca0088206d6 Mon Sep 17 00:00:00 2001 From: Marc Hernandez Date: Fri, 13 Feb 2026 19:57:53 -0800 Subject: [PATCH] JsonData skeleton --- data/JsonData.cs | 196 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 data/JsonData.cs diff --git a/data/JsonData.cs b/data/JsonData.cs new file mode 100644 index 0000000..0c5f696 --- /dev/null +++ b/data/JsonData.cs @@ -0,0 +1,196 @@ +using System; +using System.IO; +using System.Xml; +using System.Reflection; +using System.Text; + + + + +static public class json +{ + + + static public T load( string filename ) where T : lib.JsonData + { + return (T)lib.JsonData.load( filename ); + } + + static public lib.JsonData load( string filename ) + { + return lib.ConfigBase.load( filename, null ); + } + + +} + +namespace lib +{ + + public interface JsonData + { + + #region SaveLoad + + static public T res_load( string filename ) where T : JsonData + where T : class + { + return JsonData.load( filename ); + } + + static public JsonData load( string filename ) + { + return actual_load( filename, null ); + } + + static public T load( string filename ) where T : JsonData + { + return (T)actual_load( filename, typeof( T ) ); + } + + static public JsonData actual_load( string filename, Type t ) + { + JsonData cfg = null; + + try + { + if( !File.Exists( filename ) ) + { + if( filename.StartsWith( "res://" ) ) + filename.Replace( "res://", "" ); + } + + + if( File.Exists( filename ) ) + { + FileStream fs = new FileStream( filename, FileMode.Open, FileAccess.Read ); + + XmlFormatter2 formatter = new XmlFormatter2(); + + cfg = (JsonData)( t != null ? formatter.DeserializeKnownType( fs, t ) : formatter.Deserialize( fs ) ); + + cfg.SetFilename( filename ); + } + else + { + cfg = CreateTemplate( filename, t ); + } + } + catch( IOException ) + { + cfg = CreateTemplate( filename, t ); + } + + return cfg; + } + + private static JsonData CreateTemplate( string filename, Type t ) + { + log.debug( $"JsonData file {filename} not found, creating template." ); + + Type[] types = new Type[0]; + object[] parms = new object[0]; + + //types[ 0 ] = typeof( string ); + //parms[ 0 ] = filename; + JsonData cfg = null; + + ConstructorInfo cons = t?.GetConstructor( types ); + + try + { + cfg = (JsonData)cons?.Invoke( parms ); + } + catch( Exception e ) + { + log.error( $"Exception while creating config {t.ToString()}, Msg {e.Message}" ); + } + + //cfg.SetFilename( filename ); + + if( ConfigCfg.s_cfg.writeOutTemplateFiles ) + { + var templateFile = $"templates/{filename}"; + + var dirName = Path.GetDirectoryName( templateFile ); + + Util.checkAndAddDirectory( dirName ); + + log.info( $"Writing out template config of type {t?.Name} in {templateFile}" ); + + saveDebug( cfg, templateFile ); + } + + return cfg; + } + + static public void saveDebug( JsonData cfg ) + { + JsonData.actual_save( cfg, cfg.Filename ); + } + + static public void actual_save( JsonData cfg, String filename ) + { + FileStream fs = new( filename, FileMode.Create, FileAccess.Write ); + fs.Close(); + } + #endregion + + + public String Filename { get; } + } + + /* UNUSED + public record class ConfigRec : ConfigBase + { + + } + */ + + public class JsonData : ConfigBase + { + + //private int _test = 0; + + private static ser.XmlCfg s_templateCfg = new() + { + Structure = ser.Datastructure.Tree, + POD = ser.POD.Elements, + }; + + + internal static ConfigCfg s_cfg = new(); + + public static ConfigCfg Cfg => s_cfg; + + static public void startup( string filename ) + { + res.Mgr.Register( ConfigBase.load ); + res.Mgr.RegisterSub( typeof( ConfigBase ) ); + + s_cfg = ConfigBase.load( filename ); + + } + + + + public JsonData() + { + } + + public JsonData( string filename ) + { + _filename = filename; + } + + private string _filename = "{unknown}"; + + + public String Filename { get { return _filename; } } + + internal void SetFilename( String filename ) { _filename = filename; } + + + } +} +