/// <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 ?? "")) })); }
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 ?? ""); }
/// <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)); }
/// <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 ?? ""); }
/// <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)); }