diff --git a/README.md b/README.md index 87e4ae0..1703d3a 100644 --- a/README.md +++ b/README.md @@ -687,6 +687,7 @@ xml中定义如下 - 来自某个excel文件的所有单元薄 - 来自某个excel文件的指定单元薄 - 来自json、xml、lua、yaml文件 +- 来自json、xml、lua、yaml子字段 (如root.a.b) - 来自目录树下所有文件,每个文件对应一个记录 - 以上的随意组合 diff --git a/src/Luban.ClientServer/Program.cs b/src/Luban.ClientServer/Program.cs index 379ac35..60ce2f0 100644 --- a/src/Luban.ClientServer/Program.cs +++ b/src/Luban.ClientServer/Program.cs @@ -38,9 +38,6 @@ namespace Luban.ClientServer [Option('t', "template_search_path", Required = false, HelpText = "string template search path.")] public string TemplateSearchPath { get; set; } - - [Option("timezone", Required = false, HelpText = "default timezone")] - public string DefaultTimeZone { get; set; } = "Asia/Shanghai"; } private static void PrintUsage(string err) @@ -173,7 +170,6 @@ Options: StringTemplateUtil.AddTemplateSearchPath(options.TemplateSearchPath); } StringTemplateUtil.AddTemplateSearchPath(FileUtil.GetPathRelateApplicationDirectory("Templates")); - TimeZoneUtil.DefaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(options.DefaultTimeZone); GenServer.Ins.Start(true, options.Port, ProtocolStub.Factories); GenServer.Ins.RegisterJob("cfg", new Luban.Job.Cfg.JobController()); diff --git a/src/Luban.Job.Cfg/Source/DataSources/Json/JsonDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/Json/JsonDataSource.cs index 096ab21..f3592d3 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Json/JsonDataSource.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Json/JsonDataSource.cs @@ -14,20 +14,20 @@ namespace Luban.Job.Cfg.DataSources.Json { private JsonElement _data; - public override void Load(string rawUrl, string sheetName, Stream stream) + public override void Load(string rawUrl, string sheetOrFieldName, Stream stream) { RawUrl = rawUrl; this._data = JsonDocument.Parse(stream).RootElement; - if (!string.IsNullOrEmpty(sheetName)) + if (!string.IsNullOrEmpty(sheetOrFieldName)) { - if (sheetName.StartsWith("*")) + if (sheetOrFieldName.StartsWith("*")) { - sheetName = sheetName.Substring(1); + sheetOrFieldName = sheetOrFieldName.Substring(1); } - if (!string.IsNullOrEmpty(sheetName)) + if (!string.IsNullOrEmpty(sheetOrFieldName)) { - foreach (var subField in sheetName.Split('.')) + foreach (var subField in sheetOrFieldName.Split('.')) { _data = _data.GetProperty(subField); } @@ -40,12 +40,16 @@ namespace Luban.Job.Cfg.DataSources.Json var records = new List(); foreach (var ele in _data.EnumerateArray()) { - records.Add(ReadBean(ele, type)); + Record rec = ReadRecord(ele, type); + if (rec != null) + { + records.Add(rec); + } } return records; } - private Record ReadBean(JsonElement ele, TBean type) + private Record ReadRecord(JsonElement ele, TBean type) { List tags; if (ele.TryGetProperty(TAG_KEY, out var tagEle)) @@ -68,7 +72,7 @@ namespace Luban.Job.Cfg.DataSources.Json public override Record ReadOne(TBean type) { - return ReadBean(_data, type); + return ReadRecord(_data, type); } } } diff --git a/src/Luban.Job.Cfg/Source/DataSources/Lua/LuaDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/Lua/LuaDataSource.cs index ea05fc4..d277cc2 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Lua/LuaDataSource.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Lua/LuaDataSource.cs @@ -22,6 +22,21 @@ namespace Luban.Job.Cfg.DataSources.Lua RawUrl = rawUrl; _env = LuaManager.CreateEnvironment(); _dataTable = (LuaTable)_env.DoChunk(new StreamReader(stream, Encoding.UTF8), rawUrl)[0]; + + if (!string.IsNullOrEmpty(sheetName)) + { + if (sheetName.StartsWith("*")) + { + sheetName = sheetName.Substring(1); + } + if (!string.IsNullOrEmpty(sheetName)) + { + foreach (var subField in sheetName.Split('.')) + { + _dataTable = (LuaTable)_dataTable[subField]; + } + } + } } public override List ReadMulti(TBean type) diff --git a/src/Luban.Job.Cfg/Source/DataSources/Yaml/YamlDataSource.cs b/src/Luban.Job.Cfg/Source/DataSources/Yaml/YamlDataSource.cs index e7bf986..8d40bde 100644 --- a/src/Luban.Job.Cfg/Source/DataSources/Yaml/YamlDataSource.cs +++ b/src/Luban.Job.Cfg/Source/DataSources/Yaml/YamlDataSource.cs @@ -12,40 +12,56 @@ namespace Luban.Job.Cfg.DataSources.Yaml { class YamlDataSource : AbstractDataSource { - private YamlMappingNode _root; - public override void Load(string rawUrl, string sheetName, Stream stream) + private YamlNode _root; + public override void Load(string rawUrl, string sheetOrFieldName, Stream stream) { var ys = new YamlStream(); ys.Load(new StreamReader(stream)); - var rootNode = (YamlMappingNode)ys.Documents[0].RootNode; - if (string.IsNullOrEmpty(sheetName)) + var rootNode = ys.Documents[0].RootNode; + + this._root = rootNode; + + if (!string.IsNullOrEmpty(sheetOrFieldName)) { - this._root = rootNode; - } - else - { - if (rootNode.Children.TryGetValue(new YamlScalarNode(sheetName), out var childNode)) + if (sheetOrFieldName.StartsWith("*")) { - this._root = (YamlMappingNode)childNode; + sheetOrFieldName = sheetOrFieldName.Substring(1); } - else + if (!string.IsNullOrEmpty(sheetOrFieldName)) { - throw new Exception($"yaml文件:{RawUrl} 不包含子字段:{sheetName}"); + foreach (var subField in sheetOrFieldName.Split('.')) + { + this._root = _root[new YamlScalarNode(subField)]; + } } } } public override List ReadMulti(TBean type) { - throw new NotImplementedException(); + var records = new List(); + foreach (var ele in (YamlSequenceNode)_root) + { + var rec = ReadRecord(ele, type); + if (rec != null) + { + records.Add(rec); + } + } + return records; } private readonly static YamlScalarNode s_tagNameNode = new(TAG_KEY); public override Record ReadOne(TBean type) + { + return ReadRecord(_root, type); + } + + private Record ReadRecord(YamlNode yamlNode, TBean type) { string tagName; - if (_root.Children.TryGetValue(s_tagNameNode, out var tagNode)) + if (((YamlMappingNode)yamlNode).Children.TryGetValue(s_tagNameNode, out var tagNode)) { tagName = (string)tagNode; } @@ -57,7 +73,7 @@ namespace Luban.Job.Cfg.DataSources.Yaml { return null; } - var data = (DBean)type.Apply(YamlDataCreator.Ins, _root, (DefAssembly)type.Bean.AssemblyBase); + var data = (DBean)type.Apply(YamlDataCreator.Ins, yamlNode, (DefAssembly)type.Bean.AssemblyBase); var tags = DataUtil.ParseTags(tagName); return new Record(data, RawUrl, tags); }