public CodeMemberMethod CreateApiFunction(Settings settings, string relativePath, OperationType httpMethod, OpenApiOperation apiOperation, ComponentsToCsTypes coms2CsTypes, bool forAsync, bool useEnsureSuccessStatusCodeEx) { if (!(new OperationType[] { OperationType.Get, OperationType.Post, OperationType.Put, OperationType.Delete, OperationType.Patch }).Any(d => d == httpMethod)) { Trace.TraceWarning("This HTTP method {0} is not yet supported", httpMethod); return(null); } this.settings = settings; this.nameComposer = new NameComposer(settings); this.apiOperation = apiOperation; statementOfEnsureSuccessStatusCode = useEnsureSuccessStatusCodeEx ? "EnsureSuccessStatusCodeEx" : "EnsureSuccessStatusCode"; this.actionName = nameComposer.GetActionName(apiOperation, httpMethod.ToString(), relativePath); this.coms2CsTypes = coms2CsTypes; this.forAsync = forAsync; this.RelativePath = RemovePrefixSlash(relativePath); this.RelativePath = RegexFunctions.RefineUrlWithHyphenInParameters(RelativePath); if (actionName.EndsWith("Async")) { actionName = actionName[0..^ 5];
static string TranslateJsonToCode(string filePath) { OpenApiDocument doc = ReadJson(filePath); Settings settings = new Settings() { ClientNamespace = "MyNS", }; System.CodeDom.CodeCompileUnit codeCompileUnit = new System.CodeDom.CodeCompileUnit(); System.CodeDom.CodeNamespace clientNamespace = new System.CodeDom.CodeNamespace(settings.ClientNamespace); codeCompileUnit.Namespaces.Add(clientNamespace);//namespace added to Dom ComponentsToCsTypes gen = new ComponentsToCsTypes(settings, codeCompileUnit, clientNamespace); gen.CreateCodeDom(doc.Components); return(gen.WriteToText()); }
/// <summary> /// Generate CodeDom of the client API for ApiDescriptions. /// </summary> /// <param name="descriptions">Web Api descriptions exposed by Configuration.Services.GetApiExplorer().ApiDescriptions</param> public void CreateCodeDom(OpenApiPaths paths, OpenApiComponents components) { if (paths == null && components == null) { return; } clientNamespace = new CodeNamespace(settings.ClientNamespace); codeCompileUnit.Namespaces.Add(clientNamespace); //namespace added to Dom ComponentsToCsTypes componentsToCsTypes = new ComponentsToCsTypes(settings, codeCompileUnit, clientNamespace); componentsToCsTypes.CreateCodeDom(components); if (paths == null) { return; } clientNamespace.Imports.AddRange(new CodeNamespaceImport[] { new CodeNamespaceImport("System"), new CodeNamespaceImport("System.Linq"), new CodeNamespaceImport("System.Collections.Generic"), new CodeNamespaceImport("System.Threading.Tasks"), new CodeNamespaceImport("System.Net.Http"), new CodeNamespaceImport("Newtonsoft.Json"), }); if (settings.UseEnsureSuccessStatusCodeEx) { clientNamespace.Imports.Add(new CodeNamespaceImport("Fonlow.Net.Http")); } string[] containerClassNames = GetContainerClassNames(paths); CodeTypeDeclaration[] newClassesCreated = containerClassNames.Select(d => CreateControllerClientClass(clientNamespace, d)).ToArray(); foreach (KeyValuePair <string, OpenApiPathItem> p in paths) { foreach (KeyValuePair <OperationType, OpenApiOperation> op in p.Value.Operations) { ClientApiFunctionGen apiFunctionGen = new ClientApiFunctionGen(); CodeMemberMethod apiFunction = apiFunctionGen.CreateApiFunction(settings, p.Key, op.Key, op.Value, componentsToCsTypes, true, settings.UseEnsureSuccessStatusCodeEx); if (apiFunction == null) { System.Diagnostics.Trace.TraceWarning($"Not to generate C# for {p.Key} {op.Key}."); continue; } string containerClassName = nameComposer.GetContainerName(op.Value, p.Key); CodeTypeDeclaration existingClass = LookupExistingClass(containerClassName); existingClass.Members.Add(apiFunction); if (settings.GenerateBothAsyncAndSync) { ClientApiFunctionGen functionGen2 = new ClientApiFunctionGen(); existingClass.Members.Add(functionGen2.CreateApiFunction(settings, p.Key, op.Key, op.Value, componentsToCsTypes, false, settings.UseEnsureSuccessStatusCodeEx)); } } } if (settings.UseEnsureSuccessStatusCodeEx && settings.IncludeEnsureSuccessStatusCodeExBlock) { CreateDummyOfEnsureSuccessStatusCodeEx(); } }