public static int Main (string[] args) { if (args.Length == 0) { ShowHelp (true); } var generator = new TemplateGenerator (); string outputFile = null, inputFile = null; var directives = new List<string> (); var parameters = new List<string> (); var session = new Microsoft.VisualStudio.TextTemplating.TextTemplatingSession (); string preprocess = null; optionSet = new OptionSet () { { "o=|out=", "The name of the output {file}", s => outputFile = s }, { "r=", "Assemblies to reference", s => generator.Refs.Add (s) }, { "u=", "Namespaces to import <{0:namespace}>", s => generator.Imports.Add (s) }, { "I=", "Paths to search for included files", s => generator.IncludePaths.Add (s) }, { "P=", "Paths to search for referenced assemblies", s => generator.ReferencePaths.Add (s) }, { "dp=", "Directive processor (name!class!assembly)", s => directives.Add (s) }, { "a=", "Parameters ([processorName]![directiveName]!name!value)", s => parameters.Add (s) }, { "h|?|help", "Show help", s => ShowHelp (false) }, // { "k=,", "Session {key},{value} pairs", (s, t) => session.Add (s, t) }, { "c=", "Preprocess the template into {0:class}", (s) => preprocess = s }, }; var remainingArgs = optionSet.Parse (args); if (string.IsNullOrEmpty (outputFile)) { Console.Error.WriteLine ("No output file specified."); return -1; } if (remainingArgs.Count != 1) { Console.Error.WriteLine ("No input file specified."); return -1; } inputFile = remainingArgs [0]; if (!File.Exists (inputFile)) { Console.Error.WriteLine ("Input file '{0}' does not exist."); return -1; } //FIXME: implement quoting and escaping for values foreach (var par in parameters) { var split = par.Split ('!'); if (split.Length < 2) { Console.Error.WriteLine ("Parameter does not have enough values: {0}", par); return -1; } if (split.Length > 2) { Console.Error.WriteLine ("Parameter has too many values: {0}", par); return -1; } string name = split[split.Length-2]; string val = split[split.Length-1]; if (string.IsNullOrEmpty (name)) { Console.Error.WriteLine ("Parameter has no name: {0}", par); return -1; } generator.AddParameter (split.Length > 3? split[0] : null, split.Length > 2? split[split.Length-3] : null, name, val); } foreach (var dir in directives) { var split = dir.Split ('!'); if (split.Length != 3) { Console.Error.WriteLine ("Directive does not have correct number of values: {0}", dir); return -1; } foreach (var s in split) { if (string.IsNullOrEmpty (s)) { Console.Error.WriteLine ("Directive has missing value: {0}", dir); return -1; } } generator.AddDirectiveProcessor (split[0], split[1], split[2]); } if (preprocess == null) { Console.Write ("Processing '{0}'... ", inputFile); generator.ProcessTemplate (inputFile, outputFile); if (generator.Errors.HasErrors) { Console.WriteLine ("failed."); } else { Console.WriteLine ("completed successfully."); } } else { string className = preprocess; string classNamespace = null; int s = preprocess.LastIndexOf ('.'); if (s > 0) { classNamespace = preprocess.Substring (0, s); className = preprocess.Substring (s + 1); } Console.Write ("Preprocessing '{0}' into class '{1}.{2}'... ", inputFile, classNamespace, className); string language; string[] references; generator.PreprocessTemplate (inputFile, className, classNamespace, outputFile, System.Text.Encoding.UTF8, out language, out references); if (generator.Errors.HasErrors) { Console.WriteLine ("failed."); } else { Console.WriteLine ("completed successfully:"); Console.WriteLine (" Language: {0}", language); if (references != null && references.Length > 0) { Console.WriteLine (" References:"); foreach (string r in references) Console.WriteLine (" {0}", r); } } } foreach (System.CodeDom.Compiler.CompilerError err in generator.Errors) Console.Error.WriteLine ("{0}({1},{2}): {3} {4}", err.FileName, err.Line, err.Column, err.IsWarning? "WARNING" : "ERROR", err.ErrorText); return generator.Errors.HasErrors? -1 : 0; }
public static int Main(string[] args) { if (args.Length == 0) { ShowHelp(true); } var generator = new TemplateGenerator(); string outputFile = null, inputFile = null; var directives = new List <string> (); var parameters = new List <string> (); var session = new Microsoft.VisualStudio.TextTemplating.TextTemplatingSession(); string preprocess = null; optionSet = new OptionSet() { { "o=|out=", "The name of the output {file}", s => outputFile = s }, { "r=", "Assemblies to reference", s => generator.Refs.Add(s) }, { "u=", "Namespaces to import <{0:namespace}>", s => generator.Imports.Add(s) }, { "I=", "Paths to search for included files", s => generator.IncludePaths.Add(s) }, { "P=", "Paths to search for referenced assemblies", s => generator.ReferencePaths.Add(s) }, { "dp=", "Directive processor (name!class!assembly)", s => directives.Add(s) }, { "a=", "Parameters ([processorName]![directiveName]!name!value)", s => parameters.Add(s) }, { "h|?|help", "Show help", s => ShowHelp(false) }, // { "k=,", "Session {key},{value} pairs", (s, t) => session.Add (s, t) }, { "c=", "Preprocess the template into {0:class}", (s) => preprocess = s }, }; var remainingArgs = optionSet.Parse(args); if (string.IsNullOrEmpty(outputFile)) { Console.Error.WriteLine("No output file specified."); return(-1); } if (remainingArgs.Count != 1) { Console.Error.WriteLine("No input file specified."); return(-1); } inputFile = remainingArgs [0]; if (!File.Exists(inputFile)) { Console.Error.WriteLine("Input file '{0}' does not exist."); return(-1); } //FIXME: implement quoting and escaping for values foreach (var par in parameters) { var split = par.Split('!'); if (split.Length < 2) { Console.Error.WriteLine("Parameter does not have enough values: {0}", par); return(-1); } if (split.Length > 2) { Console.Error.WriteLine("Parameter has too many values: {0}", par); return(-1); } string name = split[split.Length - 2]; string val = split[split.Length - 1]; if (string.IsNullOrEmpty(name)) { Console.Error.WriteLine("Parameter has no name: {0}", par); return(-1); } generator.AddParameter(split.Length > 3? split[0] : null, split.Length > 2? split[split.Length - 3] : null, name, val); } foreach (var dir in directives) { var split = dir.Split('!'); if (split.Length != 3) { Console.Error.WriteLine("Directive does not have correct number of values: {0}", dir); return(-1); } foreach (var s in split) { if (string.IsNullOrEmpty(s)) { Console.Error.WriteLine("Directive has missing value: {0}", dir); return(-1); } } generator.AddDirectiveProcessor(split[0], split[1], split[2]); } if (preprocess == null) { Console.Write("Processing '{0}'... ", inputFile); generator.ProcessTemplate(inputFile, outputFile); if (generator.Errors.HasErrors) { Console.WriteLine("failed."); } else { Console.WriteLine("completed successfully."); } } else { string className = preprocess; string classNamespace = null; int s = preprocess.LastIndexOf('.'); if (s > 0) { classNamespace = preprocess.Substring(0, s); className = preprocess.Substring(s + 1); } Console.Write("Preprocessing '{0}' into class '{1}.{2}'... ", inputFile, classNamespace, className); string language; string[] references; generator.PreprocessTemplate(inputFile, className, classNamespace, outputFile, System.Text.Encoding.UTF8, out language, out references); if (generator.Errors.HasErrors) { Console.WriteLine("failed."); } else { Console.WriteLine("completed successfully:"); Console.WriteLine(" Language: {0}", language); if (references != null && references.Length > 0) { Console.WriteLine(" References:"); foreach (string r in references) { Console.WriteLine(" {0}", r); } } } } foreach (System.CodeDom.Compiler.CompilerError err in generator.Errors) { Console.Error.WriteLine("{0}({1},{2}): {3} {4}", err.FileName, err.Line, err.Column, err.IsWarning? "WARNING" : "ERROR", err.ErrorText); } return(generator.Errors.HasErrors? -1 : 0); }