/// <summary>
    /// Generates the Markdown.
    /// </summary>
    public override CodeGenOutput GenerateOutput(ServiceInfo service)
    {
        var httpServiceInfo = NoHttp ? null : HttpServiceInfo.Create(service);

        var template = CodeGenTemplate.Parse(TemplateText ?? GetEmbeddedResourceText("Facility.CodeGen.Markdown.template.scriban-txt"));
        var globals  = CodeGenGlobals.Create(new MarkdownGeneratorGlobals(this, service, httpServiceInfo));
        var files    = template.Generate(globals, new CodeGenSettings {
            NewLine = NewLine, IndentText = IndentText
        });

        return(new CodeGenOutput(
                   files: files.Select(x => new CodeGenFile(x.Name, x.Text)).ToList(),
                   patternsToClean: new[] { new CodeGenPattern($"{service.Name}/*.md", CodeGenUtility.GetCodeGenComment(GeneratorName ?? "")) }));
    }
Beispiel #2
0
 public static void WriteFileHeader(CodeWriter code, string generatorName)
 {
     code.WriteLine("// <auto-generated>");
     code.WriteLine("// " + CodeGenUtility.GetCodeGenComment(generatorName));
     code.WriteLine("// </auto-generated>");
 }
 public CodeTemplateGlobals(PythonGenerator generator, ServiceInfo serviceInfo, HttpServiceInfo?httpServiceInfo)
 {
     Service            = serviceInfo;
     HttpService        = httpServiceInfo;
     CodeGenCommentText = CodeGenUtility.GetCodeGenComment(generator.GeneratorName ?? "");
 }
Beispiel #4
0
        /// <summary>
        /// Generates the Python.
        /// </summary>
        public override CodeGenOutput GenerateOutput(ServiceInfo serviceInfo)
        {
            var outputFiles = new List <CodeGenFile>();

            var httpServiceInfo = HttpServiceInfo.Create(serviceInfo);

            var templateText = GetEmbeddedResourceText("Facility.CodeGen.Python.template.scriban-txt");
            var outputText   = CodeTemplateUtility.Render(templateText, new CodeTemplateGlobals(this, serviceInfo, httpServiceInfo));

            using var stringReader = new StringReader(outputText);

            var fileStart = "";

            string?line;

            while ((line = stringReader.ReadLine()) != null)
            {
                var match = Regex.Match(line, @"^==+>");
                if (match.Success)
                {
                    fileStart = match.Value;
                    break;
                }
            }

            while (line != null)
            {
                var fileName = line.Substring(fileStart.Length);

                var fileLines = new List <string>();
                while ((line = stringReader.ReadLine()) != null && !line.StartsWith(fileStart, StringComparison.Ordinal))
                {
                    fileLines.Add(line);
                }

                // skip exactly one blank line to allow file start to stand out
                if (fileLines.Count != 0 && string.IsNullOrWhiteSpace(fileLines[0]))
                {
                    fileLines.RemoveAt(0);
                }

                // remove all blank lines at the end
                while (fileLines.Count != 0 && string.IsNullOrWhiteSpace(fileLines[fileLines.Count - 1]))
                {
                    fileLines.RemoveAt(fileLines.Count - 1);
                }

                outputFiles.Add(CreateFile(fileName.Trim(), code =>
                {
                    foreach (var fileLine in fileLines)
                    {
                        code.WriteLine(fileLine);
                    }
                }));
            }

            var codeGenComment  = CodeGenUtility.GetCodeGenComment(GeneratorName ?? "");
            var patternsToClean = new[]
            {
                new CodeGenPattern("*.py", codeGenComment),
            };

            return(new CodeGenOutput(outputFiles, patternsToClean));
        }
Beispiel #5
0
        /// <summary>
        /// Generates Swagger (OpenAPI 2.0) for a service definition.
        /// </summary>
        public SwaggerService GenerateSwaggerService(ServiceInfo service)
        {
            var httpServiceInfo = HttpServiceInfo.Create(service);

            var swaggerService = new SwaggerService
            {
                Swagger = SwaggerUtility.SwaggerVersion,
                Info    = new SwaggerInfo
                {
                    Identifier  = service.Name,
                    Title       = GetSummaryOrNull(service) ?? service.Name,
                    Description = GetRemarksOrNull(service),
                    Version     = service.TryGetAttribute("info")?.TryGetParameterValue("version") ?? "0.0.0",
                    CodeGen     = CodeGenUtility.GetCodeGenComment(GeneratorName ?? ""),
                },
            };

            var defaultBaseUri = httpServiceInfo.Url;

            if (defaultBaseUri != null)
            {
                var baseUri = new Uri(defaultBaseUri);
                swaggerService.Host    = baseUri.Host;
                swaggerService.Schemes = new[] { baseUri.Scheme };

                string basePath = baseUri.PathAndQuery;
                if (!string.IsNullOrEmpty(basePath) && basePath != "/")
                {
                    swaggerService.BasePath = baseUri.PathAndQuery;
                }
            }

            var paths = new OurDictionary <string, SwaggerOperations>();

            foreach (var httpMethodInfo in httpServiceInfo.Methods)
            {
                AddMethodToPaths(paths, service, httpMethodInfo);
            }
            swaggerService.Paths = paths;

            var dtoInfos = new OurDictionary <string, ServiceDtoInfo>();

            foreach (var httpMethodInfo in httpServiceInfo.Methods)
            {
                if (httpMethodInfo.RequestBodyField != null)
                {
                    AddDtos(dtoInfos, GetDtosForType(service.GetFieldType(httpMethodInfo.RequestBodyField.ServiceField) !));
                }

                AddDto(dtoInfos, TryCreateMethodRequestBodyType(httpMethodInfo)?.Dto);

                foreach (var httpResponseInfo in httpMethodInfo.ValidResponses)
                {
                    if (httpResponseInfo.BodyField != null)
                    {
                        AddDtos(dtoInfos, GetDtosForType(service.GetFieldType(httpResponseInfo.BodyField.ServiceField) !));
                    }

                    AddDto(dtoInfos, TryCreateMethodResponseBodyType(httpMethodInfo, httpResponseInfo)?.Dto);
                }
            }

            while (true)
            {
                var dtoCount = dtoInfos.Count;
                foreach (var field in dtoInfos.Values.SelectMany(x => x.Fields).ToList())
                {
                    AddDtos(dtoInfos, GetDtosForType(service.GetFieldType(field) !));
                }
                if (dtoCount == dtoInfos.Count)
                {
                    break;
                }
            }

            var definitions = new OurDictionary <string, SwaggerSchema>();

            foreach (var dtoInfo in dtoInfos.Values)
            {
                definitions[dtoInfo.Name] = GetDtoSchema(service, dtoInfo);
            }
            swaggerService.Definitions = definitions.Count == 0 ? null : definitions;

            return(swaggerService);
        }
	public MarkdownGeneratorGlobals(MarkdownGenerator generator, ServiceInfo serviceInfo, HttpServiceInfo? httpServiceInfo)
	{
		Service = serviceInfo;
		HttpService = httpServiceInfo;
		CodeGenCommentText = CodeGenUtility.GetCodeGenComment(generator.GeneratorName ?? "");
	}
Beispiel #7
0
        /// <summary>
        /// Generates an FSD file for a service definition.
        /// </summary>
        protected override CodeGenOutput GenerateOutputCore(ServiceInfo service)
        {
            var output = CreateNamedText($"{service.Name}.fsd", code =>
            {
                if (!string.IsNullOrWhiteSpace(GeneratorName))
                {
                    code.WriteLine("// " + CodeGenUtility.GetCodeGenComment(GeneratorName));
                    code.WriteLine();
                }

                var remarks = new List <string>();
                if (service.Remarks.Count != 0)
                {
                    remarks.AddRange(new[] { "", $"# {service.Name}", "" }.Concat(service.Remarks));
                }

                WriteSummaryAndAttributes(code, service);
                code.WriteLine($"service {service.Name}");
                using (code.Block())
                {
                    foreach (var member in service.Members)
                    {
                        var method = member as ServiceMethodInfo;
                        if (method != null)
                        {
                            code.WriteLineSkipOnce();
                            WriteSummaryAndAttributes(code, method);
                            code.WriteLine($"method {method.Name}");
                            using (code.Block("{", "}:"))
                                WriteFields(code, method.RequestFields);
                            using (code.Block())
                                WriteFields(code, method.ResponseFields);

                            if (method.Remarks.Count != 0)
                            {
                                remarks.AddRange(new[] { "", $"# {method.Name}", "" }.Concat(method.Remarks));
                            }
                        }

                        var dto = member as ServiceDtoInfo;
                        if (dto != null)
                        {
                            code.WriteLineSkipOnce();
                            WriteSummaryAndAttributes(code, dto);
                            code.WriteLine($"data {dto.Name}");
                            using (code.Block())
                                WriteFields(code, dto.Fields);

                            if (dto.Remarks.Count != 0)
                            {
                                remarks.AddRange(new[] { "", $"# {dto.Name}", "" }.Concat(dto.Remarks));
                            }
                        }

                        var enumInfo = member as ServiceEnumInfo;
                        if (enumInfo != null)
                        {
                            code.WriteLineSkipOnce();
                            WriteSummaryAndAttributes(code, enumInfo);
                            code.WriteLine($"enum {enumInfo.Name}");
                            using (code.Block())
                                WriteEnumValues(code, enumInfo.Values);

                            if (enumInfo.Remarks.Count != 0)
                            {
                                remarks.AddRange(new[] { "", $"# {enumInfo.Name}", "" }.Concat(enumInfo.Remarks));
                            }
                        }

                        var errorSet = member as ServiceErrorSetInfo;
                        if (errorSet != null)
                        {
                            code.WriteLineSkipOnce();
                            WriteSummaryAndAttributes(code, errorSet);
                            code.WriteLine($"errors {errorSet.Name}");
                            using (code.Block())
                                WriteErrors(code, errorSet.Errors);

                            if (errorSet.Remarks.Count != 0)
                            {
                                remarks.AddRange(new[] { "", $"# {errorSet.Name}", "" }.Concat(errorSet.Remarks));
                            }
                        }
                    }
                }

                foreach (string remark in remarks)
                {
                    code.WriteLine(remark);
                }
            });

            return(new CodeGenOutput(output));
        }