Пример #1
0
        static void Main(string[] args)
        {
            // RAML files to be processed
            string[] inputFiles = null;

            // read config file
            var builder = new ConfigurationBuilder()
                          .SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("appsettings.json");

            Configuration = builder.Build();

            var appconfig = new AppConfig();

            Configuration.Bind(appconfig);

            string fileName             = appconfig.InputFileName;
            string inputDirectory       = appconfig.InputDirectory;
            string outputDirectory      = appconfig.OutputDirectory;
            bool   generateXml          = appconfig.GenerateXmlSchema.HasValue ? appconfig.GenerateXmlSchema.Value : false;
            bool   generateJson         = appconfig.GenerateJsonSchema.HasValue ? appconfig.GenerateJsonSchema.Value : false;
            bool   generateCSharp       = appconfig.GenerateCSharpCode.HasValue ? appconfig.GenerateCSharpCode.Value : false;
            bool   generateTypeScript   = appconfig.GenerateTypeScriptCode.HasValue ? appconfig.GenerateTypeScriptCode.Value : false;
            bool   generateDescriptions = appconfig.GenerateDescriptions.HasValue ? appconfig.GenerateDescriptions.Value : false;

            RootTypeNames = appconfig.RootTypes;


            if (inputDirectory == null)
            {
                inputDirectory = Directory.GetCurrentDirectory();
            }

            if (outputDirectory == null)
            {
                outputDirectory = inputDirectory;
            }

            string xmlNamespace        = "http://tempuri.org/";
            string xmlOutputDirectory  = null;
            string csNamespace         = "DataContract";
            string csOutputDirectory   = null;
            string jsonOutputDirectory = null;
            string tsOutputDirectory   = null;
            int?   tsIndentSize        = null;

            var csconfig = new CSharpConfig();

            Configuration.GetSection(ConfigurationStrings.CSharpSectionName).Bind(csconfig);
            if (!string.IsNullOrEmpty(csconfig.Namespace))
            {
                csNamespace = csconfig.Namespace;
            }
            csOutputDirectory = csconfig.OutputDirectory;

            var tsonconfig = new TypeScriptConfig();

            Configuration.GetSection(ConfigurationStrings.TypeScriptSectionName).Bind(tsonconfig);
            bool tsDisableTSLint = false;

            if (tsonconfig != null)
            {
                tsOutputDirectory = tsonconfig.OutputDirectory;
                if (tsonconfig.IndentSize.HasValue)
                {
                    tsIndentSize = tsonconfig.IndentSize.Value;
                }
                if (tsonconfig.DisableTSLint.HasValue)
                {
                    tsDisableTSLint = tsonconfig.DisableTSLint.Value;
                }
            }

            var jsonconfig = new JsonSchemaConfig();

            Configuration.GetSection(ConfigurationStrings.JsonSectionName).Bind(jsonconfig);
            jsonOutputDirectory = jsonconfig.OutputDirectory;

            var xmlconfig = new XmlSchemaConfig();

            Configuration.GetSection(ConfigurationStrings.XmlSectionName).Bind(xmlconfig);
            xmlNamespace       = xmlconfig.Namespace;
            xmlOutputDirectory = xmlconfig.OutputDirectory;


            // override using input parameters
            foreach (string arg in args)
            {
                if (string.Compare(arg, 0, "/file:", 0, 6, true) == 0)
                {
                    fileName = arg.Substring(6);
                }
                else if (string.Compare(arg, 0, "/xmlNS:", 0, 7, true) == 0)
                {
                    xmlNamespace = arg.Substring(7);
                }
                else if (string.Compare(arg, 0, "/csNS:", 0, 74, true) == 0)
                {
                    csNamespace = arg.Substring(6);
                }
                else if (string.Compare(arg, 0, "/cs", 0, 3, true) == 0)
                {
                    generateCSharp = true;
                }
                else if (string.Compare(arg, 0, "/ts", 0, 3, true) == 0)
                {
                    generateTypeScript = true;
                }
                else if (string.Compare(arg, 0, "/inputDir:", 0, 10, true) == 0)
                {
                    inputDirectory = arg.Substring(10);
                }
                else if (string.Compare(arg, 0, "/outputDir:", 0, 11, true) == 0)
                {
                    outputDirectory = arg.Substring(11);
                }
                else if (string.Compare(arg, 0, "/xml", 0, 4, true) == 0)
                {
                    generateXml = true;
                }
                else if (string.Compare(arg, 0, "/json", 0, 5, true) == 0)
                {
                    generateJson = true;
                }
                else if (string.Compare(arg, 0, "/desc", 0, 5, true) == 0)
                {
                    generateDescriptions = true;
                }
                else
                {
                    Console.WriteLine(ErrorMessages.UnrecognizedParameter, arg);
                    ShowHelp();
                    return;
                }
            }

            if (!string.IsNullOrEmpty(fileName))  // do single file if it was specified
            {
                inputFiles    = new string[1];
                inputFiles[0] = Path.GetFullPath(fileName);
            }
            else
            {
                inputFiles = Directory.GetFiles(Path.GetFullPath(inputDirectory), "*." + FileExtensions.Raml);
            }

            var options = new ConversionOptions()
            {
                GenerateDescriptions = generateDescriptions,
                XmlNamespace         = xmlNamespace,
                CSharpNamespace      = csNamespace,
                OutputDirectory      = outputDirectory
            };


            foreach (string file in inputFiles)
            {
                var ramlFile = new RamlFile(file);

                if (generateJson)
                {
                    if (!string.IsNullOrEmpty(jsonOutputDirectory))
                    {
                        options.OutputDirectory = jsonOutputDirectory;
                    }

                    var jsonConverter = new JsonConverter(ramlFile);
                    jsonConverter.ConvertRaml(options);
                }

                if (generateXml)
                {
                    if (!string.IsNullOrEmpty(xmlOutputDirectory))
                    {
                        options.OutputDirectory = xmlOutputDirectory;
                    }

                    var xmlConverter = new XmlConverter(ramlFile);
                    xmlConverter.ConvertRaml(options);
                }
                if (generateCSharp)
                {
                    if (!string.IsNullOrEmpty(csOutputDirectory))
                    {
                        options.OutputDirectory = csOutputDirectory;
                    }

                    var cSharpConverter = new CSharpConverter(ramlFile);
                    cSharpConverter.ConvertRaml(options);
                }
                if (generateTypeScript)
                {
                    if (!string.IsNullOrEmpty(tsOutputDirectory))
                    {
                        options.OutputDirectory = tsOutputDirectory;
                    }
                    if (tsIndentSize.HasValue)
                    {
                        options.IndentSize = tsIndentSize;
                    }

                    options.DisableTSLint = tsDisableTSLint;

                    var typeScriptConverter = new TypeScriptConverter(ramlFile);
                    typeScriptConverter.ConvertRaml(options);
                }
            }
        }
        public async Task <IEnumerable <ConversionResult> > ConvertAsync(string dllFileName, string outputFolder = null)
        {
            AssemblyLoader
            .LoadAllAssemblies(
                dllFileName,
                out var tsCurrentAssemblyClasses,
                out var tsReferencedAssemblyClasses);

            if (!string.IsNullOrEmpty(outputFolder))
            {
                if (!Directory.Exists(outputFolder))
                {
                    Console.WriteLine($"Creating directory {outputFolder}");
                    Directory.CreateDirectory(outputFolder);
                    if (!Directory.Exists(outputFolder))
                    {
                        throw new Exception($"Could not create folder {outputFolder}");
                    }
                }
            }

            var results = new List <ConversionResult>();

            var unMappedDependencies = new List <Type>();

            do
            {
                unMappedDependencies.Clear();

                await
                Task.WhenAll(
                    tsCurrentAssemblyClasses.Select(o =>
                {
                    try
                    {
                        var mappedTypeScriptClass =
                            TypeScriptConverter
                            .Convert(o, tsCurrentAssemblyClasses, tsReferencedAssemblyClasses, unMappedDependencies);

                        var output =
                            FileBuilder
                            .BuildTypeScriptClass(mappedTypeScriptClass);

                        var fileName = $"{o.Name}.ts";

                        results.Add(
                            new ConversionResult
                        {
                            FileName = fileName,
                            FileData = output.ToString(),
                            Hash     = o.GUID
                        });

                        return(Task.CompletedTask);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("--------- ERROR ---------");
                        Console.WriteLine($"Could not convert class {o.FullName}");
                        Console.WriteLine(e.Message);
                        Console.WriteLine("-------------------------");
                        return(Task.FromException(e));
                    }
                }));

                // Remove duplicates
                unMappedDependencies =
                    unMappedDependencies
                    .Distinct()
                    .ToList();

                // Remove existing (prevent circular references)
                unMappedDependencies =
                    unMappedDependencies
                    .Where(o => !results.Select(r => r.Hash).Contains(o.GUID))
                    .ToList();

                tsCurrentAssemblyClasses = new List <Type>(unMappedDependencies);
            } while (unMappedDependencies.Any());

            if (!string.IsNullOrEmpty(outputFolder))
            {
                await
                Task.WhenAll(
                    results
                    .Select(o =>
                {
                    var filePath = $"{outputFolder}{(outputFolder.EndsWith("\\") ? null : "\\")}{o.FileName}";
                    try
                    {
                        if (File.Exists(filePath))
                        {
                            Console.WriteLine($"File [{filePath}] exists, skipping");
                        }
                        else
                        {
                            Console.WriteLine($"Writing file [{filePath}]");
                            File.WriteAllTextAsync(filePath, o.FileData.ToString());
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("--------- ERROR ---------");
                        Console.WriteLine($"Could not write file {filePath}");
                        Console.WriteLine(e.Message);
                        Console.WriteLine("-------------------------");
                        return(Task.FromException(e));
                    }

                    return(Task.CompletedTask);
                }));
            }

            return(results);
        }