diff --git a/XmlSchemaClassGenerator.Console/Program.cs b/XmlSchemaClassGenerator.Console/Program.cs index b0dafb2..05f4241 100644 --- a/XmlSchemaClassGenerator.Console/Program.cs +++ b/XmlSchemaClassGenerator.Console/Program.cs @@ -17,7 +17,7 @@ namespace XmlSchemaClassGenerator.Console { static class Program { - static void Main(string[] args) + static int Main(string[] args) { var showHelp = args.Length == 0; var namespaces = new List(); @@ -165,7 +165,7 @@ A file name may be given by appending a pipe sign (|) followed by a file name (l if (showHelp) { ShowHelp(options); - return; + return 0; } var uris = new List(); @@ -181,7 +181,7 @@ A file name may be given by appending a pipe sign (|) followed by a file name (l if (expandedGlob.Count == 0) { System.Console.WriteLine($"No files found for '{globOrUri}'"); - Environment.Exit(1); + Environment.Exit((int)ExitCodes.FileNotFound); } uris.AddRange(expandedGlob); @@ -267,6 +267,17 @@ A file name may be given by appending a pipe sign (|) followed by a file name (l if (verbose) { generator.Log = s => System.Console.Out.WriteLine(s); } generator.Generate(uris); + + return !generator.ValidationError ? (int)ExitCodes.Ok : (int)ExitCodes.ValidationError; + } + + enum ExitCodes + { + Ok = 0, + FileNotFound = 1, + InvalidNameSubstitutionFile = 2, + InvalidNamespaceFile = 3, + ValidationError = 4 } private static void ParseNamespaceFiles(List namespaces, List namespaceFiles) @@ -280,12 +291,12 @@ private static void ParseNamespaceFiles(List namespaces, List na var parts = line.Split('='); if (parts.Length == 1) - parts = new[] { string.Empty, parts[0] }; + parts = [string.Empty, parts[0]]; if (parts.Length != 2) { System.Console.WriteLine($"{namespaceFile}:{number}: Line format is XML namespace = C# namespace [file name]"); - Environment.Exit(1); + Environment.Exit((int)ExitCodes.InvalidNamespaceFile); } var xmlns = parts[0].Trim(); @@ -312,7 +323,7 @@ private static void ParseNameSubstituteFiles(List nameSubstitutes, List< if (parts.Length != 2) { System.Console.WriteLine($"{nameSubstituteFile}:{number}: Line format is prefixed type/member name = substitute name"); - Environment.Exit(2); + Environment.Exit((int)ExitCodes.InvalidNameSubstitutionFile); } var generatedName = parts[0].Trim(); diff --git a/XmlSchemaClassGenerator/FileOutputWriter.cs b/XmlSchemaClassGenerator/FileOutputWriter.cs index 2d15524..fc50c6c 100644 --- a/XmlSchemaClassGenerator/FileOutputWriter.cs +++ b/XmlSchemaClassGenerator/FileOutputWriter.cs @@ -61,8 +61,7 @@ protected virtual void WriteFile(string path, CodeCompileUnit cu) } finally { - if (fs != null) - fs.Dispose(); + fs?.Dispose(); } } diff --git a/XmlSchemaClassGenerator/Generator.cs b/XmlSchemaClassGenerator/Generator.cs index b9e7b69..6f3ce81 100644 --- a/XmlSchemaClassGenerator/Generator.cs +++ b/XmlSchemaClassGenerator/Generator.cs @@ -336,6 +336,8 @@ public bool SeparateNamespaceHierarchy set { _configuration.SeparateNamespaceHierarchy = value; } } + public bool ValidationError { get; private set; } + static Generator() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); @@ -347,12 +349,15 @@ public void Generate(IEnumerable files) var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore }; var readers = files.Select(f => XmlReader.Create(f, settings)); + ValidationError = false; + set.XmlResolver = new XmlUrlResolver(); set.ValidationEventHandler += (s, e) => { var ex = e.Exception as Exception; while (ex != null) { + ValidationError = true; Log?.Invoke(ex.Message); ex = ex.InnerException; } diff --git a/XmlSchemaClassGenerator/TypeModel.cs b/XmlSchemaClassGenerator/TypeModel.cs index ec66cf2..f5923a7 100644 --- a/XmlSchemaClassGenerator/TypeModel.cs +++ b/XmlSchemaClassGenerator/TypeModel.cs @@ -1094,7 +1094,7 @@ private IEnumerable GetAttributes(bool isArray, TypeMo var qualifiedName = xmlSchemaType.GetQualifiedName(); if ((qualifiedName.Namespace == XmlSchema.Namespace && qualifiedName.Name != "anySimpleType") && - (xmlSchemaType.Datatype.ValueType == typeof(DateTime) && configuration.DateTimeWithTimeZone) == false) + (xmlSchemaType.Datatype.ValueType == typeof(DateTime) && Configuration.DateTimeWithTimeZone) == false) { args.Add(new("DataType", new CodePrimitiveExpression(qualifiedName.Name))); break;