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());
        }
Exemple #3
0
        /// <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();
            }
        }