Bump BouncyCastle.Cryptography from 2.2.1 to 2.3.1 in /XUnitTest.Core (#142)
dependabot[bot] 编写于 2024-05-15 07:16:03 GitHub 提交于 2024-05-15 07:16:03
X
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using NewLife;
using NewLife.Log;
using XCode.Code;

namespace XCodeTool
{
    class Program
    {
        static void Main(string[] args)
        {
            XTrace.UseConsole();

            //if (args.Length == 0)
            {
                Console.WriteLine("NewLife.XCode v{0}", Assembly.GetExecutingAssembly().GetName().Version);
                Console.WriteLine("Usage: xcode model.xml");
                Console.WriteLine();
                //Console.WriteLine("commands:");
                //Console.WriteLine("\tentity\t\tGenerate entity class");
                //Console.WriteLine("\tmodel\t\tGenerate model class");
                //Console.WriteLine("\tinterface\tGenerate interface");
                //Console.WriteLine();
                //Console.WriteLine("options:");
                //Console.WriteLine("\t-output <PATH>\t\t输出目录");
                //Console.WriteLine("\t-baseClass <NAME>\t\t基类。可能包含基类和接口,其中{name}替换为Table.Name");
                //Console.WriteLine("\t-classNameTemplate <NAME>\t类名模板。其中{name}替换为Table.Name,如{name}Model/I{name}Dto等");
                //Console.WriteLine("\t-modelNameForCopy <NAME>\t用于生成拷贝函数的模型类。例如{name}或I{name}");
            }

            var file = "";
            if (args.Length > 0) file = args.LastOrDefault();
            if (file.IsNullOrEmpty())
            {
                var di = Environment.CurrentDirectory.AsDirectory();
                // 选当前目录第一个
                file = di.GetFiles("*.xml", SearchOption.TopDirectoryOnly).FirstOrDefault()?.FullName;
            }
            if (!file.IsNullOrEmpty())
            {
                if (!Path.IsPathRooted(file))
                {
                    var file2 = Environment.CurrentDirectory.CombinePath(file);
                    if (File.Exists(file2)) file = file2;
                }
                if (!File.Exists(file))
                {
                    Console.WriteLine("文件不存在:{0}", file);
                    return;
                }

                Build(file);
            }
            else
            {
                // 实在没有,释放一个出来
                var ms = Assembly.GetExecutingAssembly().GetManifestResourceStream("XCode.Model.xml");
                var xml = ms.ToStr();

                file = Environment.CurrentDirectory.CombinePath("Model.xml");
                File.WriteAllText(file, xml);
            }
        }

        static void Build(String modelFile)
        {
            Console.WriteLine("正在处理:{0}", modelFile);

            EntityBuilder.Debug = true;

            // 设置当前工作目录
            PathHelper.BasePath = Path.GetDirectoryName(modelFile);

            // 设置如何格式化字段名,默认去掉下划线并转驼峰命名
            //ModelResolver.Current = new ModelResolver { TrimUnderline = false, Camel = false };

            // 加载模型文件,得到数据表
            var option = new BuilderOption();
            var tables = ClassBuilder.LoadModels(modelFile, option, out var atts);
            EntityBuilder.FixModelFile(modelFile, option, atts, tables);

            // 简易模型类名称,如{name}Model。指定后将生成简易模型类和接口,可用于数据传输
            var modelClass = atts["ModelClass"];
            var modelInterface = atts["ModelInterface"];

            // 生成实体类
            option.BaseClass = null;
            option.ClassNameTemplate = null;
            option.ModelNameForCopy = null;
            if (!modelInterface.IsNullOrEmpty())
            {
                option.BaseClass = modelInterface;
                option.ModelNameForCopy = modelInterface;
            }
            else if (!modelClass.IsNullOrEmpty())
            {
                option.ModelNameForCopy = modelClass;
            }
            EntityBuilder.BuildTables(tables, option, chineseFileName: true);

            // 生成简易模型类
            option.Output = @"..\Models\";
            option.BaseClass = modelInterface;
            option.ClassNameTemplate = modelClass;
            option.ModelNameForCopy = !modelInterface.IsNullOrEmpty() ? modelInterface : modelClass;
            if (!modelClass.IsNullOrEmpty())
            {
                ClassBuilder.BuildModels(tables, option);
            }
            else
            {
                var ts = tables.Where(e => !e.Properties["ModelClass"].IsNullOrEmpty()).ToList();
                if (ts.Count > 0)
                {
                    ClassBuilder.BuildModels(ts, option);
                }
            }

            // 生成简易接口
            option.Output = @"..\Interfaces\";
            option.BaseClass = null;
            option.ClassNameTemplate = modelInterface;
            option.ModelNameForCopy = null;
            if (!modelInterface.IsNullOrEmpty())
            {
                ClassBuilder.BuildInterfaces(tables, option);
            }
            else
            {
                var ts = tables.Where(e => !e.Properties["ModelInterface"].IsNullOrEmpty()).ToList();
                if (ts.Count > 0)
                {
                    ClassBuilder.BuildInterfaces(ts, option);
                }
            }
        }
    }
}