public void AddFields(IOpenApiObjectToTypeService openApiObjectToTypeService,
                              IObjectsProcessingKeyStore keyStore,
                              TypeBuilder typeBuilder,
                              IEnumerable <IOpenApiType> extendedTypes,
                              IDictionary <string, IOpenApiType> definitions)
        {
            foreach (var openApiType in extendedTypes)
            {
                Type donorType = typeof(object);
                donorType = _typeResolver.GetType(openApiObjectToTypeService,
                                                  keyStore,
                                                  openApiType,
                                                  definitions,
                                                  $"PropertyHolder_{Guid.NewGuid()}");

                if (donorType == typeof(object))
                {
                    throw new NotSupportedException($"Type in All Of property for {typeBuilder.Name} not recognised");
                }

                foreach (var field in donorType.GetFields(BindingFlags.Public | BindingFlags.Instance))
                {
                    typeBuilder.DefineField(field.Name,
                                            field.FieldType,
                                            FieldAttributes.Public);
                }
            }
        }
        public Type GetType(IOpenApiObjectToTypeService objectService,
                            IOpenApiUmbrellaTypeResolver typeResolver,
                            IObjectsProcessingKeyStore objectKeyStore,
                            OpenApiReferencedType referencedType,
                            IDictionary <string, IOpenApiType> definitions)
        {
            var typeName = _lastTokenService.GetLastToken(referencedType.Type);

            if (!CurrentTypeHolder.Types.TryGetValue(typeName, out var existingType))
            {
                if (!definitions.TryGetValue(typeName, out var definedNotCreated))
                {
                    throw new NotSupportedException($"Referenced type {typeName} is not defined in OpenApi document");
                }

                //handle circular reference
                objectKeyStore.ThrowIfPresent(typeName);

                var createdType = typeResolver.GetType(objectService,
                                                       objectKeyStore,
                                                       definedNotCreated,
                                                       definitions,
                                                       typeName);

                CurrentTypeHolder.Types[typeName] = createdType;

                return(createdType);
            }

            return(existingType);
        }
示例#3
0
 public OpenApiEndpointToEndpointService(IOpenApiUmbrellaTypeResolver openApiUmbrellaTypeResolver,
                                         IOpenApiPrimitiveToTypeService openApiPrimitiveToTypeService,
                                         IOpenApiObjectToTypeService openApiObjectToTypeService)
 {
     _typeResolver        = openApiUmbrellaTypeResolver;
     _primitiveService    = openApiPrimitiveToTypeService;
     _objectToTypeService = openApiObjectToTypeService;
 }
示例#4
0
 public OpenApiSpecModelToGeneratedTypesService(IOpenApiObjectToTypeService openApiObjectToTypeService,
                                                IOpenApiUmbrellaTypeResolver openApiUmbrellaTypeResolver,
                                                IOpenApiEndpointToEndpointService openApiEndpointToEndpointService)
 {
     _objectGenerationService = openApiObjectToTypeService;
     _typeResolver            = openApiUmbrellaTypeResolver;
     _endpointService         = openApiEndpointToEndpointService;
 }
        public Type GetType(IOpenApiObjectToTypeService objectService,
                            IObjectsProcessingKeyStore objectKeyStore,
                            IOpenApiType openApiType,
                            IDictionary <string, IOpenApiType> definitions,
                            string suggestedObjectName = null)
        {
            if (openApiType is OpenApiPrimitiveType)
            {
                return(_primitiveService.GetType((OpenApiPrimitiveType)openApiType,
                                                 nameIfEnum: suggestedObjectName));
            }

            if (openApiType.Matches <OpenApiReferencedType>())
            {
                return(_referenceService.GetType(objectService,
                                                 typeResolver: this,
                                                 objectKeyStore,
                                                 (OpenApiReferencedType)openApiType,
                                                 definitions));
            }

            if (openApiType.Matches <OpenApiObjectType>())
            {
                return(objectService.GetType((OpenApiObjectType)openApiType,
                                             definitions,
                                             suggestedObjectName,
                                             objectKeyStore));
            }

            if (openApiType.Matches <OpenApiArrayType>())
            {
                var memberType      = ((OpenApiArrayType)openApiType).Items;
                var arrayMemberType = GetType(objectService,
                                              objectKeyStore,
                                              memberType,
                                              definitions,
                                              suggestedObjectName + "Member");

                return(typeof(IEnumerable <>).MakeGenericType(arrayMemberType));
            }

            throw new NotSupportedException($"Unable to convert unsupported " +
                                            $"OpenApi Type {openApiType.GetType()}");
        }