예제 #1
0
        private void UpdateMethod(Dictionary <string, MethodData> methods, string methodName, MethodInfo moduleMethod)
        {
            CliFunctionAttribute functionAttribute = moduleMethod.GetCustomAttribute <CliFunctionAttribute>();
            CliPropertyAttribute propertyAttribute = moduleMethod.GetCustomAttribute <CliPropertyAttribute>();

            methods.Remove(methodName, out MethodData commonMethod);
            commonMethod.InvocationType = InvocationType.Both;
            commonMethod.IsFunction     = functionAttribute != null;

            if (commonMethod.Description?.Length == 0)
            {
                commonMethod.Description = functionAttribute?.Description ?? propertyAttribute?.Description;
            }

            if (commonMethod.ResponseDescription?.Length == 0)
            {
                commonMethod.ResponseDescription = functionAttribute?.ResponseDescription ?? propertyAttribute?.ResponseDescription;
            }

            if (commonMethod.ExampleResponse?.Length == 0)
            {
                commonMethod.ExampleResponse = functionAttribute?.ExampleResponse ?? propertyAttribute?.ExampleResponse;
            }

            methods.Add(methodName, commonMethod);
        }
예제 #2
0
        public void Generate()
        {
            StringBuilder descriptionsBuilder = new StringBuilder(@"CLI
***

CLI access is not currently included in the Nethermind launcher but will be added very soon.

");

            List <Type> cliModules = new List <Type>();

            foreach (string assemblyName in _assemblyNames)
            {
                Assembly assembly = Assembly.Load(new AssemblyName(assemblyName));
                foreach (Type type in assembly.GetTypes().Where(t => typeof(CliModuleBase).IsAssignableFrom(t)).Where(t => !t.IsInterface && !t.IsAbstract))
                {
                    if (!type.Name.Contains("Ndm"))
                    {
                        cliModules.Add(type);
                    }
                }
            }

            foreach (Type cliModule in cliModules.OrderBy(t => t.Name))
            {
                CliModuleAttribute moduleAttribute = cliModule.GetCustomAttribute <CliModuleAttribute>();
                descriptionsBuilder.Append($@"{moduleAttribute.ModuleName}
{string.Empty.PadLeft(moduleAttribute.ModuleName.Length, '^')}

");

                var properties = cliModule.GetMethods(BindingFlags.Public | BindingFlags.Instance);
                foreach (MethodInfo methodInfo in properties.OrderBy(p => p.Name))
                {
                    CliPropertyAttribute propertyAttribute = methodInfo.GetCustomAttribute <CliPropertyAttribute>();
                    CliFunctionAttribute functionAttribute = methodInfo.GetCustomAttribute <CliFunctionAttribute>();

                    if (propertyAttribute != null)
                    {
                        descriptionsBuilder.AppendLine($" {propertyAttribute.ObjectName}.{propertyAttribute.PropertyName}")
                        .AppendLine($"  {propertyAttribute.Description ?? "<check JSON RPC docs>"}")
                        .AppendLine();
                    }

                    if (functionAttribute != null)
                    {
                        descriptionsBuilder.AppendLine($" {functionAttribute.ObjectName}.{functionAttribute.FunctionName}({string.Join(", ", methodInfo.GetParameters().Select(p => p.Name))})")
                        .AppendLine($"  {functionAttribute.Description ?? "<check JSON RPC docs>"}")
                        .AppendLine();
                    }
                }
            }

            string result = descriptionsBuilder.ToString();

            Console.WriteLine(result);
            string sourceDir = DocsDirFinder.FindDocsDir();

            File.WriteAllText(Path.Combine(sourceDir, "cli.rst"), result);
        }
예제 #3
0
        private string GetCliMethodName(MethodInfo moduleMethod)
        {
            CliFunctionAttribute functionAttribute = moduleMethod.GetCustomAttribute <CliFunctionAttribute>();
            CliPropertyAttribute propertyAttribute = moduleMethod.GetCustomAttribute <CliPropertyAttribute>();

            return(functionAttribute?.FunctionName ??
                   propertyAttribute?.PropertyName ??
                   string.Concat(moduleMethod.Name.Substring(0, 1).ToLower(), moduleMethod.Name.Substring(1)));
        }
예제 #4
0
        private void AddNewMethod(Dictionary <string, MethodData> methods, string cliModuleName, string methodName, MethodInfo moduleMethod)
        {
            CliFunctionAttribute functionAttribute = moduleMethod.GetCustomAttribute <CliFunctionAttribute>();
            CliPropertyAttribute propertyAttribute = moduleMethod.GetCustomAttribute <CliPropertyAttribute>();

            if (functionAttribute?.ObjectName == cliModuleName || propertyAttribute?.ObjectName == cliModuleName)
            {
                MethodData methodData = new MethodData()
                {
                    ReturnType          = moduleMethod.ReturnType,
                    Parameters          = moduleMethod.GetParameters(),
                    Description         = functionAttribute?.Description ?? propertyAttribute?.Description,
                    ResponseDescription = functionAttribute?.ResponseDescription ?? propertyAttribute?.ResponseDescription,
                    ExampleResponse     = functionAttribute?.ExampleResponse ?? propertyAttribute?.ExampleResponse,
                    IsFunction          = functionAttribute != null,
                    InvocationType      = InvocationType.Cli
                };

                methods.Add(methodName, methodData);
            }
        }
예제 #5
0
        private void GenerateDocFileContent(Type cliType, string docsDir)
        {
            StringBuilder docBuilder = new StringBuilder();

            string moduleName = cliType.Name.Replace("CliModule", "");

            MethodInfo[] moduleMethods = cliType.GetMethods(BindingFlags.Public | BindingFlags.Instance).OrderBy(m => m.Name).ToArray();
            List <Type>  cliTypesToDescribe;

            docBuilder.AppendLine(@$ "# {moduleName}");
            docBuilder.AppendLine();
            moduleName = moduleName.ToLower();
            // ToFix: GetType, ToString, Equals, GetHashCode force excluding below
            foreach (MethodInfo method in moduleMethods.Where(method => method.Name != "GetType" && method.Name != "ToString" && method.Name != "Equals" && method.Name != "GetHashCode"))
            {
                CliFunctionAttribute attributeFun  = method.GetCustomAttribute <CliFunctionAttribute>();
                CliPropertyAttribute attributeProp = method.GetCustomAttribute <CliPropertyAttribute>();

                ParameterInfo[] parameters = method.GetParameters();
                cliTypesToDescribe = new List <Type>();

                StringBuilder methodArg    = new StringBuilder();
                StringBuilder paramBuilder = new StringBuilder();

                if (parameters.Length == 0)
                {
                    paramBuilder.AppendLine("_None_");
                }
                else
                {
                    paramBuilder.AppendLine("| Parameter name | Type |");
                    paramBuilder.AppendLine("| :--- | :--- |");
                    methodArg.Append("(");
                    string cliParameterType;
                    foreach (ParameterInfo parameter in method.GetParameters())
                    {
                        cliParameterType = _sharedContent.GetTypeToWrite(parameter.ParameterType, cliTypesToDescribe);
                        paramBuilder.AppendLine($"| {parameter.Name} | `{cliParameterType}` |");
                        methodArg.Append($"{parameter.Name}, ");
                    }

                    methodArg.Remove(methodArg.Length - 2, 2);
                    methodArg.Append(")");
                }

                docBuilder.AppendLine(@$ "## {moduleName}.{attributeFun?.FunctionName
                                                              ?? attributeProp?.PropertyName 
                                                              ?? method.Name.Substring(0,1).ToLower() + method.Name.Substring(1)
                    }{methodArg}");
                docBuilder.AppendLine();
                docBuilder.AppendLine(@$ "{attributeFun?.Description ?? attributeProp?.Description ?? " "} ");
                docBuilder.AppendLine();
                _markdownGenerator.OpenTabs(docBuilder);
                _markdownGenerator.CreateTab(docBuilder, "Request");
                docBuilder.AppendLine(@"### **Parameters**");
                docBuilder.AppendLine();

                docBuilder.Append(paramBuilder);

                _markdownGenerator.CloseTab(docBuilder);
                docBuilder.AppendLine();
                _markdownGenerator.CreateTab(docBuilder, "Response");
                docBuilder.AppendLine(@$ "### Return type");
                docBuilder.AppendLine();

                Type   returnType    = method.ReturnType;
                string returnRpcType = _sharedContent.GetTypeToWrite(returnType, cliTypesToDescribe);

                docBuilder.AppendLine(@$ "`{returnRpcType}`");

                _markdownGenerator.CloseTab(docBuilder);

                if (cliTypesToDescribe.Count != 0)
                {
                    docBuilder.AppendLine();
                    _markdownGenerator.CreateTab(docBuilder, "Object definitions");
                    _sharedContent.AddObjectsDescription(docBuilder, cliTypesToDescribe);
                    _markdownGenerator.CloseTab(docBuilder);
                }

                _markdownGenerator.CloseTabs(docBuilder);
                docBuilder.AppendLine();

                if (attributeFun?.ExampleRequest != null || attributeFun?.ExampleResponse != null)
                {
                    docBuilder.AppendLine(@"### **Example**");
                    _markdownGenerator.OpenTabs(docBuilder);
                    _markdownGenerator.CreateTab(docBuilder, "Request");
                    _markdownGenerator.CreateCodeBlock(docBuilder, $"{attributeFun?.ExampleRequest ?? ""}");
                    _markdownGenerator.CloseTab(docBuilder);
                    _markdownGenerator.CreateTab(docBuilder, "Response");
                    _markdownGenerator.CreateCodeBlock(docBuilder, $"{attributeFun?.ExampleResponse ?? ""}");
                    _markdownGenerator.CloseTab(docBuilder);
                    _markdownGenerator.CloseTabs(docBuilder);
                    docBuilder.AppendLine();
                }
            }