public async Task <IActionResult> GenerateZip([FromForm] string definitionName, [FromForm] string definitionText, [FromForm] string generatorName, CancellationToken cancellationToken) { var request = new GenerateRequestDto { Definition = new NamedTextDto { Name = definitionName, Text = definitionText, }, Generator = new GeneratorDto { Name = generatorName, }, }; var result = await m_api.GenerateAsync(request, cancellationToken).ConfigureAwait(true); if (result.IsFailure) { return(CreateActionResultFromError(result.Error)); } var response = result.Value; var failure = response.Failure; if (failure != null) { return(CreateActionResultFromError(ServiceErrors.CreateInvalidRequest($"({failure.Line},{failure.Column}): {failure.Message}"))); } return(new FileCallbackResult("application/zip", async(outputStream, _) => { using (var zipArchive = new ZipArchive(new WriteOnlyStreamWrapper(outputStream), ZipArchiveMode.Create)) { foreach (var namedText in response.Output) { var zipEntry = zipArchive.CreateEntry(namedText.Name); using (var zipStream = zipEntry.Open()) using (var writer = new StreamWriter(zipStream)) await writer.WriteAsync(namedText.Text).ConfigureAwait(false); } } }) { FileDownloadName = $"{request.Generator.Name}.zip" }); }
public async Task <ServiceResult <GenerateResponseDto> > GenerateAsync(GenerateRequestDto request, CancellationToken cancellationToken) { if (request == null) { throw new ArgumentNullException(nameof(request)); } try { var input = new NamedText(request.Definition?.Name ?? "", request.Definition?.Text ?? ""); bool isSwagger = ServiceDefinitionUtility.DetectFormat(input) == ServiceDefinitionFormat.Swagger; var service = isSwagger ? new SwaggerParser().ParseDefinition(input) : new FsdParser().ParseDefinition(input); var generatorName = request.Generator?.Name; switch (generatorName) { case "csharp": return(ServiceResult.Success(GenerateCode(() => new CSharpGenerator(), g => g.GenerateOutput(service)))); case "javascript": return(ServiceResult.Success(GenerateCode(() => new JavaScriptGenerator(), g => g.GenerateOutput(service)))); case "typescript": return(ServiceResult.Success(GenerateCode(() => new JavaScriptGenerator { TypeScript = true }, g => g.GenerateOutput(service)))); case "markdown": return(ServiceResult.Success(GenerateCode(() => new MarkdownGenerator(), g => g.GenerateOutput(service)))); case "fsd": return(ServiceResult.Success(GenerateCode(() => new FsdGenerator(), g => g.GenerateOutput(service)))); case "swagger-json": return(ServiceResult.Success(GenerateCode(() => new SwaggerGenerator(), g => g.GenerateOutput(service)))); case "swagger-yaml": return(ServiceResult.Success(GenerateCode(() => new SwaggerGenerator { Yaml = true }, g => g.GenerateOutput(service)))); case "asp-net-web-api": return(ServiceResult.Success(GenerateCode(() => new AspNetGenerator(), g => g.GenerateOutput(service)))); case "crash": throw new InvalidOperationException("Intentional exception for diagnostic purposes."); default: return(ServiceResult.Failure(ServiceErrors.CreateInvalidRequest($"Unrecognized generator '{generatorName}'."))); } } catch (ServiceDefinitionException exception) { return(ServiceResult.Success(new GenerateResponseDto { Failure = new FailureDto { Message = exception.Error, Line = exception.Position.LineNumber, Column = exception.Position.ColumnNumber, }, })); } }
/// <summary> /// Generates code from a service definition. /// </summary> public Task <ServiceResult <GenerateResponseDto> > GenerateAsync(GenerateRequestDto request, CancellationToken cancellationToken) { return(TrySendRequestAsync(FacilityGeneratorApiHttpMapping.GenerateMapping, request, cancellationToken)); }