/// <summary>
        /// Dispatches to the right handler method for writing generated code to output file(s).
        /// </summary>
        /// <param name="generateOptions"></param>
        internal static void HandleGenerateCode(GenerateOptions generateOptions)
        {
            var settingsFromFile = generateOptions.GetConfigInstance(ProgressReporter);
            var settings         = settingsFromFile ?? XObjectsCoreGenerator.LoadLinqToXsdSettings();

            if (settingsFromFile != null)
            {
                PrintLn("Configuration file(s) loaded...".Gray());
            }

            settings.EnableServiceReference = generateOptions.EnableServiceReference;

            var textWriters = generateOptions.AutoConfig
                ? XObjectsCoreGenerator.Generate(generateOptions.SchemaFiles)
                : XObjectsCoreGenerator.Generate(generateOptions.SchemaFiles, settings);

            if (generateOptions.Output.IsEmpty())
            {
                PrintLn("No output directory given: defaulting to same directory as XSD file(s).".Gray());
                generateOptions.Output = "-1";
            }

            var hasCsExt = Path.GetExtension(generateOptions.Output).EndsWith(".cs");

            // merge the output into a single file
            if (hasCsExt)
            {
                GenerateCodeDispatcher.HandleWriteOutputToSingleFile(generateOptions, textWriters);
            }
            else
            {
                GenerateCodeDispatcher.HandleWriteOutputToMultipleFiles(generateOptions, textWriters);
            }
        }
Exemple #2
0
            /// <summary>
            /// Writes generated code to a single output file.
            /// </summary>
            /// <param name="options"></param>
            /// <param name="textWriters"></param>
            internal static void HandleWriteOutputToSingleFile(GenerateOptions options, Dictionary <string, TextWriter> textWriters)
            {
                var outputFile = options.Output;
                // add .cs extension to filename if it doesn't have it already.
                var target = outputFile.EndsWith(".cs") ? outputFile : $"{outputFile}.cs";

                var extractFileNameOnlyFunctor = new Func <string, string>(k => $"'{Path.GetFileName(k)}'");

                PrintLn($"{textWriters.Keys.ToDelimitedString(extractFileNameOnlyFunctor).Yellow()}");
                PrintLn($"\toutput to \n{target}");

                using (var fileStream = File.Open(target, FileMode.Create, FileAccess.ReadWrite))
                    using (var fileWriter = new StreamWriter(fileStream, Encoding.UTF8))
                    {
                        foreach (var kvp in textWriters)
                        {
                            fileWriter.Write(kvp.Value);
                        }
                    }
            }
Exemple #3
0
        /// <summary>
        /// Dispatches to the right handler method for writing generated code to output file(s).
        /// </summary>
        /// <param name="generateOptions"></param>
        internal static void HandleGenerateCode(GenerateOptions generateOptions)
        {
            var settings = generateOptions.GetConfigInstance(ProgressReporter) ?? XObjectsCoreGenerator.LoadLinqToXsdSettings();

            if (generateOptions.GetConfigInstance() != null)
            {
                Console.WriteLine("Configuration file(s) loaded...");
            }

            settings.EnableServiceReference = generateOptions.EnableServiceReference;

            var textWriters = generateOptions.AutoConfig
                ? XObjectsCoreGenerator.Generate(generateOptions.SchemaFiles)
                : XObjectsCoreGenerator.Generate(generateOptions.SchemaFiles, settings);

            if (generateOptions.Output.IsEmpty())
            {
                if (generateOptions.FoldersWereGiven)
                {
                    Console.WriteLine("No output directory given: defaulting to same directory as XSD file(s).");
                    generateOptions.Output = "-1";
                }
                else
                {
                    generateOptions.Output = Environment.CurrentDirectory;
                    Console.WriteLine($"No output directory given: defaulting to current working directory: {Environment.CurrentDirectory}.");
                }
            }

            var hasCsExt = Path.GetExtension(generateOptions.Output).EndsWith(".cs");

            if (hasCsExt) // merge the output into a single file
            {
                GenerateCodeDispatcher.HandleWriteOutputToSingleFile(generateOptions.Output, textWriters);
            }
            else
            {
                GenerateCodeDispatcher.HandleWriteOutputToMultipleFiles(generateOptions.Output, textWriters);
            }
        }
Exemple #4
0
            /// <summary>
            /// Writes generated code for to multiple output files, inferred by <see cref="GenerateOptions.Output"/>.
            /// </summary>
            internal static void HandleWriteOutputToMultipleFiles(GenerateOptions options, Dictionary <string, TextWriter> textWriters)
            {
                var possibleOutputFolder = options.Output;

                PrintLn($"Outputting {textWriters.Count} files...".Gray());
                foreach (var kvp in textWriters)
                {
                    var    outputFilename = Path.GetFileName($"{kvp.Key}.cs");
                    string outputFilePath;

                    if (possibleOutputFolder == "-1")
                    {
                        outputFilePath = Path.Combine(Path.GetDirectoryName(kvp.Key), outputFilename);
                    }
                    else if (possibleOutputFolder.IsNotEmpty())
                    {
                        outputFilePath = Path.Combine(possibleOutputFolder, outputFilename);
                    }
                    else
                    {
                        outputFilePath = Path.GetFullPath(outputFilename);
                    }

                    var fullPathOfContainingDir = Path.GetDirectoryName(outputFilePath);

                    if (!Directory.Exists(fullPathOfContainingDir))
                    {
                        PrintLn($"Creating directory: {fullPathOfContainingDir}".Yellow());
                        Directory.CreateDirectory(fullPathOfContainingDir);
                    }

                    PrintLn($"{kvp.Key} => {outputFilePath}".Gray());

                    using (var outputFileStream = File.Open(outputFilePath, FileMode.Create, FileAccess.ReadWrite))
                        using (var fileWriter = new StreamWriter(outputFileStream))
                        {
                            fileWriter.Write(kvp.Value);
                        }
                }
            }