/// <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); } }
/// <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); } } }
/// <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); } }
/// <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); } } }