static int Main(string[] args) { (ExitCode exitCode, string parseResponseString) = ArgsParser.TryParse(args, out ArgsParser argsParsed); if (exitCode == ExitCode.Success) { switch (argsParsed.Command) { case "generate": { Console.WriteLine($"Loading assembly from {Path.Combine(Directory.GetCurrentDirectory(), argsParsed.InputAssemblyPath)}"); if (!string.IsNullOrEmpty(Path.GetDirectoryName(argsParsed.OutputPath)) && !Directory.Exists(Path.GetDirectoryName(argsParsed.OutputPath))) { Console.WriteLine($"Creating directory {Path.GetDirectoryName(argsParsed.OutputPath)}"); Directory.CreateDirectory(Path.GetDirectoryName(argsParsed.OutputPath)); } var convertedAssemblyPath = Path.Combine(Directory.GetCurrentDirectory(), argsParsed.InputAssemblyPath); Assembly startupAssembly = Assembly.LoadFrom(convertedAssemblyPath); switch (argsParsed.DiagramType) { case MermaidDiagramType.ER: { switch (argsParsed.GenerationType) { case GenerationType.NonFluent: { var erGenerator = new ErNonFluentGenerator(startupAssembly.GetTypes().ToList()); erGenerator.Generate(); Console.WriteLine($"Mermaid ER diagram generated from {argsParsed.InputAssemblyPath}"); if (argsParsed.OutputPath == "stdout") { Console.WriteLine(erGenerator.ErDiagram); return((int)ExitCode.Success); } else { try { File.WriteAllText(argsParsed.OutputPath, erGenerator.ErDiagram); } catch (Exception e) { Console.WriteLine(e.Message); return((int)ExitCode.Error); } return((int)exitCode); } } case GenerationType.Fluent: { Console.WriteLine("Fluent generation is not yet supported"); return((int)ExitCode.CommandUnknown); } default: { Console.WriteLine($"Unknown generationType {argsParsed.GenerationType.ToString()}"); return((int)ExitCode.CommandUnknown); } } } default: { Console.WriteLine($"No valid diagram type generator found for {argsParsed.DiagramType.ToString()}"); return((int)ExitCode.Error); } } } case "--help": { Console.WriteLine("Usage -- mermaid-gen {--help|generate {args}}"); Console.WriteLine("\t{args}:"); Console.WriteLine("\t\t-a,--input-assembly-file\tpath to dll"); Console.WriteLine("\t\t-t,--diagram-type\t\ttype of Mermaid diagram to generate (options are {er | class}). Defaults to er"); Console.WriteLine("\t\t-o,--output-path\t\toutput path for mermaid diagram, including file name. provide the string 'stdout' to get command line output"); Console.WriteLine("\t\t-g,--generation-type\t\tgeneration type (options are {no-fluent | fluent}). If you are using any fluent configuration, use fluent; otherwise, use no-fluent. Defaults to no-fluent"); return((int)ExitCode.Success); } default: { Console.WriteLine(parseResponseString); return((int)ExitCode.Error); } } } else { Console.WriteLine(parseResponseString); return((int)exitCode); } }
public static (ExitCode, string) TryParse(string[] args, out ArgsParser argsParser) { argsParser = new ArgsParser(); if (!ArgsParser.acceptedCommands.Any(a => a == args[0])) { return(ExitCode.CommandUnknown, $"Command {args[0]} not found"); } else { argsParser.Command = args[0]; } try { for (int i = 1; i < args.Length; i += 2) { switch (args[i]) { case "-a": case "--input-assembly-path": if (acceptedArgs.Contains(args[i + 1])) { return(ExitCode.Error, $""); } argsParser.InputAssemblyPath = args[i + 1]; break; case "-o": case "--output-path": if (acceptedArgs.Contains(args[i + 1])) { return(ExitCode.Error, $""); } argsParser.OutputPath = args[i + 1]; break; case "-t": case "--diagram-type": if (acceptedArgs.Contains(args[i + 1])) { return(ExitCode.Error, $""); } switch (args[i + 1]) { case "er": argsParser.DiagramType = MermaidDiagramType.ER; break; case "class": argsParser.DiagramType = MermaidDiagramType.Class; break; default: // If we got here, someone is requesting an unsupported DiagramType return(ExitCode.Error, $""); } break; case "-g": case "--generation-type": if (acceptedArgs.Contains(args[i + 1])) { return(ExitCode.Error, $""); } switch (args[i + 1]) { case "no-fluent": argsParser.GenerationType = GenerationType.NonFluent; break; case "fluent": argsParser.GenerationType = GenerationType.Fluent; break; default: // If we got here, someone is requesting an unsupported DiagramType return(ExitCode.Error, $""); } break; default: // If we got here, we have an unbalanced set of args return(ExitCode.Error, $""); } } } catch (Exception e) { // TODO: Handle unbalanced args array here Console.WriteLine(e.Message); return(ExitCode.Error, $""); } return(ExitCode.Success, $""); }