private List <LogKeyValueItem> GenerateContracts(List <ApiOperationSchemaMap> operationSchemaMappings)
        {
            if (operationSchemaMappings == null)
            {
                throw new ArgumentNullException(nameof(operationSchemaMappings));
            }

            var sgContractModels     = new List <SyntaxGeneratorContractModel>();
            var sgContractParameters = new List <SyntaxGeneratorContractParameter>();
            var sgContractResults    = new List <SyntaxGeneratorContractResult>();
            var sgContractInterfaces = new List <SyntaxGeneratorContractInterface>();

            foreach (var basePathSegmentName in projectOptions.BasePathSegmentNames)
            {
                var generatorModels = new SyntaxGeneratorContractModels(projectOptions, operationSchemaMappings, basePathSegmentName);
                var generatedModels = generatorModels.GenerateSyntaxTrees();
                sgContractModels.AddRange(generatedModels);

                var generatorParameters = new SyntaxGeneratorContractParameters(projectOptions, basePathSegmentName);
                var generatedParameters = generatorParameters.GenerateSyntaxTrees();
                sgContractParameters.AddRange(generatedParameters);

                var generatorResults = new SyntaxGeneratorContractResults(projectOptions, basePathSegmentName);
                var generatedResults = generatorResults.GenerateSyntaxTrees();
                sgContractResults.AddRange(generatedResults);

                var generatorInterfaces = new SyntaxGeneratorContractInterfaces(projectOptions, basePathSegmentName);
                var generatedInterfaces = generatorInterfaces.GenerateSyntaxTrees();
                sgContractInterfaces.AddRange(generatedInterfaces);
            }

            ApiGeneratorHelper.CollectMissingContractModelFromOperationSchemaMappings(
                projectOptions,
                operationSchemaMappings,
                sgContractModels);

            var logItems = new List <LogKeyValueItem>();

            foreach (var sg in sgContractModels)
            {
                logItems.Add(sg.ToFile());
            }

            foreach (var sg in sgContractParameters)
            {
                logItems.Add(sg.ToFile());
            }

            foreach (var sg in sgContractResults)
            {
                logItems.Add(sg.ToFile());
            }

            foreach (var sg in sgContractInterfaces)
            {
                logItems.Add(sg.ToFile());
            }

            return(logItems);
        }
Beispiel #2
0
    private void GenerateContracts(
        List <ApiOperationSchemaMap> operationSchemaMappings)
    {
        ArgumentNullException.ThrowIfNull(operationSchemaMappings);

        var sgContractModels     = new List <SyntaxGeneratorContractModel>();
        var sgContractParameters = new List <SyntaxGeneratorContractParameter>();
        var sgContractResults    = new List <SyntaxGeneratorContractResult>();
        var sgContractInterfaces = new List <SyntaxGeneratorContractInterface>();

        foreach (var basePathSegmentName in projectOptions.BasePathSegmentNames)
        {
            var generatorModels = new SyntaxGeneratorContractModels(logger, projectOptions, operationSchemaMappings, basePathSegmentName);
            var generatedModels = generatorModels.GenerateSyntaxTrees();
            sgContractModels.AddRange(generatedModels);

            var generatorParameters = new SyntaxGeneratorContractParameters(logger, projectOptions, basePathSegmentName);
            var generatedParameters = generatorParameters.GenerateSyntaxTrees();
            sgContractParameters.AddRange(generatedParameters);

            var generatorResults = new SyntaxGeneratorContractResults(logger, projectOptions, basePathSegmentName);
            var generatedResults = generatorResults.GenerateSyntaxTrees();
            sgContractResults.AddRange(generatedResults);

            var generatorInterfaces = new SyntaxGeneratorContractInterfaces(logger, projectOptions, basePathSegmentName);
            var generatedInterfaces = generatorInterfaces.GenerateSyntaxTrees();
            sgContractInterfaces.AddRange(generatedInterfaces);
        }

        ApiGeneratorHelper.CollectMissingContractModelFromOperationSchemaMappings(
            logger,
            projectOptions,
            operationSchemaMappings,
            sgContractModels);

        foreach (var sg in sgContractModels)
        {
            sg.ToFile();
        }

        foreach (var sg in sgContractParameters)
        {
            sg.ToFile();
        }

        foreach (var sg in sgContractResults)
        {
            sg.ToFile();
        }

        foreach (var sg in sgContractInterfaces)
        {
            sg.ToFile();
        }
    }
Beispiel #3
0
    private void GenerateContracts(
        List <ApiOperationSchemaMap> operationSchemaMappings)
    {
        ArgumentNullException.ThrowIfNull(operationSchemaMappings);

        var sgContractModels     = new List <SyntaxGeneratorContractModel>();
        var sgContractParameters = new List <SyntaxGeneratorContractParameter>();

        foreach (var basePathSegmentName in projectOptions.BasePathSegmentNames)
        {
            var generatorModels = new SyntaxGeneratorContractModels(logger, apiProjectOptions, operationSchemaMappings, basePathSegmentName);
            var generatedModels = generatorModels.GenerateSyntaxTrees();
            sgContractModels.AddRange(generatedModels);

            var generatorParameters = new SyntaxGeneratorContractParameters(logger, apiProjectOptions, basePathSegmentName);
            var generatedParameters = generatorParameters.GenerateSyntaxTrees();
            sgContractParameters.AddRange(generatedParameters);
        }

        ApiGeneratorHelper.CollectMissingContractModelFromOperationSchemaMappings(
            logger,
            apiProjectOptions,
            operationSchemaMappings,
            sgContractModels);

        foreach (var sg in sgContractModels)
        {
            sg.IsForClient  = true;
            sg.UseOwnFolder = false;
            sg.ToFile();
        }

        foreach (var sg in sgContractParameters)
        {
            sg.IsForClient  = true;
            sg.UseOwnFolder = false;
            sg.ToFile();
        }
    }
Beispiel #4
0
        private static List <LogKeyValueItem> GenerateContracts(ApiProjectOptions apiProjectOptions, List <ApiOperationSchemaMap> operationSchemaMappings)
        {
            if (apiProjectOptions == null)
            {
                throw new ArgumentNullException(nameof(apiProjectOptions));
            }

            if (operationSchemaMappings == null)
            {
                throw new ArgumentNullException(nameof(operationSchemaMappings));
            }

            var sgContractModels     = new List <SyntaxGeneratorContractModel>();
            var sgContractParameters = new List <SyntaxGeneratorContractParameter>();
            var sgContractResults    = new List <SyntaxGeneratorContractResult>();
            var sgContractInterfaces = new List <SyntaxGeneratorContractInterface>();

            foreach (var basePathSegmentName in apiProjectOptions.BasePathSegmentNames)
            {
                var generatorModels = new SyntaxGeneratorContractModels(apiProjectOptions, operationSchemaMappings, basePathSegmentName);
                var generatedModels = generatorModels.GenerateSyntaxTrees();
                sgContractModels.AddRange(generatedModels);

                var generatorParameters = new SyntaxGeneratorContractParameters(apiProjectOptions, basePathSegmentName);
                var generatedParameters = generatorParameters.GenerateSyntaxTrees();
                sgContractParameters.AddRange(generatedParameters);

                var generatorResults = new SyntaxGeneratorContractResults(apiProjectOptions, basePathSegmentName);
                var generatedResults = generatorResults.GenerateSyntaxTrees();
                sgContractResults.AddRange(generatedResults);

                var generatorInterfaces = new SyntaxGeneratorContractInterfaces(apiProjectOptions, basePathSegmentName);
                var generatedInterfaces = generatorInterfaces.GenerateSyntaxTrees();
                sgContractInterfaces.AddRange(generatedInterfaces);
            }

            var missingOperationSchemaMappings = new List <ApiOperationSchemaMap>();

            foreach (var map in operationSchemaMappings)
            {
                if (sgContractModels.FirstOrDefault(x => x.ApiSchemaKey.Equals(map.SchemaKey, StringComparison.OrdinalIgnoreCase)) == null)
                {
                    missingOperationSchemaMappings.Add(map);
                }
            }

            foreach (var map in missingOperationSchemaMappings)
            {
                if (missingOperationSchemaMappings.Count(x => x.SchemaKey.Equals(map.SchemaKey, StringComparison.OrdinalIgnoreCase)) > 1)
                {
                    throw new NotImplementedException($"SchemaKey: {map.SchemaKey} is not generated and exist multiple times - location-calculation is missing.");
                }

                var generatorModel = new SyntaxGeneratorContractModel(
                    apiProjectOptions,
                    map.SchemaKey,
                    apiProjectOptions.Document.Components.Schemas.First(x => x.Key.Equals(map.SchemaKey, StringComparison.OrdinalIgnoreCase)).Value,
                    map.SegmentName);

                generatorModel.GenerateCode();
                sgContractModels.Add(generatorModel);
            }

            var logItems = new List <LogKeyValueItem>();

            foreach (var sg in sgContractModels)
            {
                logItems.Add(sg.ToFile());
            }

            foreach (var sg in sgContractParameters)
            {
                logItems.Add(sg.ToFile());
            }

            foreach (var sg in sgContractResults)
            {
                logItems.Add(sg.ToFile());
            }

            foreach (var sg in sgContractInterfaces)
            {
                logItems.Add(sg.ToFile());
            }

            return(logItems);
        }
Beispiel #5
0
    public List <EndpointMethodMetadata> GetMetadataForMethods()
    {
        var list = new List <EndpointMethodMetadata>();

        foreach (var(key, value) in ApiProjectOptions.Document.GetPathsByBasePathSegmentName(FocusOnSegmentName))
        {
            var generatorParameters = new SyntaxGeneratorContractParameters(logger, ApiProjectOptions, FocusOnSegmentName);
            var generatedParameters = generatorParameters.GenerateSyntaxTrees();
            var hasGlobalParameters = value.HasParameters();

            foreach (var apiOperation in value.Operations)
            {
                var httpAttributeRoutePart = GetHttpAttributeRoutePart(key);
                var routePart = string.IsNullOrEmpty(httpAttributeRoutePart)
                    ? $"/{GetRouteSegment()}"
                    : $"/{GetRouteSegment()}/{httpAttributeRoutePart}";
                var operationName = apiOperation.Value.GetOperationName();

                string?contractParameterTypeName = null;
                if (apiOperation.Value.HasParametersOrRequestBody() ||
                    value.HasParameters())
                {
                    contractParameterTypeName = operationName + NameConstants.ContractParameters;
                }

                var sgContractParameter = generatedParameters.FirstOrDefault(x => x.ApiOperation.GetOperationName() == operationName);

                var responseTypes = apiOperation.Value.Responses.GetResponseTypes(
                    OperationSchemaMappings,
                    FocusOnSegmentName,
                    ApiProjectOptions.ProjectName,
                    useProblemDetailsAsDefaultResponseBody: false,
                    includeEmptyResponseTypes: false,
                    hasGlobalParameters || apiOperation.Value.HasParametersOrRequestBody(),
                    includeIfNotDefinedAuthorization: false,
                    includeIfNotDefinedInternalServerError: false,
                    isClient: false);

                var responseTypeNamesAndItemSchema = GetResponseTypeNamesAndItemSchema(responseTypes);

                var endpointMethodMetadata = new EndpointMethodMetadata(
                    ApiProjectOptions.UseNullableReferenceTypes,
                    ApiProjectOptions.ProjectName,
                    FocusOnSegmentName,
                    $"{ApiProjectOptions.RouteBase}{routePart}",
                    apiOperation.Key,
                    operationName,
                    "I" + operationName + NameConstants.ContractHandler,
                    contractParameterTypeName,
                    operationName + NameConstants.ContractResult,
                    responseTypeNamesAndItemSchema,
                    sgContractParameter,
                    ApiProjectOptions.Document.Components.Schemas,
                    OperationSchemaMappings);

                list.Add(endpointMethodMetadata);
            }
        }

        return(list);
    }