Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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, $"");
        }