private void Convert(SwaggerParserContext context)
        {
            if (m_swaggerService.Swagger == null)
            {
                m_errors.Add(context.CreateError("swagger field is missing."));
            }
            else if (m_swaggerService.Swagger != SwaggerUtility.SwaggerVersion)
            {
                m_errors.Add(context.CreateError($"swagger should be '{SwaggerUtility.SwaggerVersion}'.", "swagger"));
            }

            if (m_swaggerService.Info == null)
            {
                m_errors.Add(context.CreateError("info is missing."));
            }

            var name = m_serviceName;

            if (name != null && !ServiceDefinitionUtility.IsValidName(name))
            {
                m_errors.Add(context.CreateError("ServiceName generator option is not a valid service name."));
            }
            if (name == null)
            {
                name = m_swaggerService.Info?.Identifier;
            }
            if (name != null && !ServiceDefinitionUtility.IsValidName(name))
            {
                m_errors.Add(context.CreateError("info/x-identifier is not a valid service name.", "info/x-identifier"));
            }
            if (name == null && m_swaggerService.Info?.Title is string title)
            {
                name = CodeGenUtility.ToPascalCase(title);
            }
            if (name == null)
            {
                m_errors.Add(context.CreateError("info/title is missing.", "info"));
            }
            if (name != null && !ServiceDefinitionUtility.IsValidName(name))
            {
                m_errors.Add(context.CreateError("info/title is not a valid service name.", "info/title"));
            }

            var attributes = new List <ServiceAttributeInfo>();

            var version = m_swaggerService.Info?.Version;

            if (!string.IsNullOrWhiteSpace(version))
            {
                attributes.Add(new ServiceAttributeInfo("info",
                                                        new[] { new ServiceAttributeParameterInfo("version", version !, context.CreatePart("info/version") !) },
예제 #2
0
        internal static void ResolveOperations(this SwaggerService swaggerService, ref SwaggerOperations swaggerOperations, ref SwaggerParserContext context)
        {
            if (swaggerOperations.Ref != null)
            {
                const string refPrefix = "#/paths/";
                if (!swaggerOperations.Ref.StartsWith(refPrefix, StringComparison.Ordinal))
                {
                    throw new ServiceDefinitionException("Operations $ref must start with '#/paths/'.", context.CreatePosition());
                }

                string name = UnescapeRefPart(swaggerOperations.Ref.Substring(refPrefix.Length));
                if (!swaggerService.Paths.TryGetValue(name, out swaggerOperations))
                {
                    throw new ServiceDefinitionException($"Missing path named '{name}'.", context.CreatePosition());
                }

                context = context.Root.CreateContext("paths/" + name);
            }
        }
        public static SwaggerConversion Create(SwaggerService swaggerService, string?serviceName, SwaggerParserContext context)
        {
            var conversion = new SwaggerConversion(swaggerService, serviceName);

            conversion.Convert(context);
            return(conversion);
        }
예제 #4
0
        /// <summary>
        /// Implements TryParseDefinition.
        /// </summary>
        protected override bool TryParseDefinitionCore(ServiceDefinitionText text, out ServiceInfo?service, out IReadOnlyList <ServiceDefinitionError> errors)
        {
            var isFsd = new FsdParser().TryParseDefinition(text, out service, out errors);

            if (isFsd || text.Name.EndsWith(".fsd", StringComparison.OrdinalIgnoreCase))
            {
                return(isFsd);
            }

            service = null;

            if (string.IsNullOrWhiteSpace(text.Text))
            {
                errors = new[] { new ServiceDefinitionError("Service definition is missing.", new ServiceDefinitionPosition(text.Name, 1, 1)) };
                return(false);
            }

            SwaggerService       swaggerService;
            SwaggerParserContext context;

            if (!s_detectJsonRegex.IsMatch(text.Text))
            {
                // parse YAML
                var yamlDeserializer = new DeserializerBuilder()
                                       .IgnoreUnmatchedProperties()
                                       .WithNamingConvention(new OurNamingConvention())
                                       .Build();
                using (var stringReader = new StringReader(text.Text))
                {
                    try
                    {
                        swaggerService = yamlDeserializer.Deserialize <SwaggerService>(stringReader);
                    }
                    catch (YamlException exception)
                    {
                        var          errorMessage    = exception.InnerException?.Message ?? exception.Message;
                        const string errorStart      = "): ";
                        var          errorStartIndex = errorMessage.IndexOf(errorStart, StringComparison.OrdinalIgnoreCase);
                        if (errorStartIndex != -1)
                        {
                            errorMessage = errorMessage.Substring(errorStartIndex + errorStart.Length);
                        }

                        errors = new[] { new ServiceDefinitionError(errorMessage, new ServiceDefinitionPosition(text.Name, exception.End.Line, exception.End.Column)) };
                        return(false);
                    }
                }

                if (swaggerService == null)
                {
                    errors = new[] { new ServiceDefinitionError("Service definition is missing.", new ServiceDefinitionPosition(text.Name, 1, 1)) };
                    return(false);
                }

                context = SwaggerParserContext.FromYaml(text);
            }
            else
            {
                // parse JSON
                using (var stringReader = new StringReader(text.Text))
                    using (var jsonTextReader = new JsonTextReader(stringReader))
                    {
                        try
                        {
                            swaggerService = JsonSerializer.Create(SwaggerUtility.JsonSerializerSettings).Deserialize <SwaggerService>(jsonTextReader);
                        }
                        catch (JsonException exception)
                        {
                            errors = new[] { new ServiceDefinitionError(exception.Message, new ServiceDefinitionPosition(text.Name, jsonTextReader.LineNumber, jsonTextReader.LinePosition)) };
                            return(false);
                        }

                        context = SwaggerParserContext.FromJson(text);
                    }
            }

            var conversion = SwaggerConversion.Create(swaggerService, ServiceName, context);

            service = conversion.Service;
            errors  = conversion.Errors;
            return(errors.Count == 0);
        }