Как разобрать расширения yaml в OpenApi. NET в. NET классы? - PullRequest
0 голосов
/ 27 января 2020

Мне нужно написать ExtensionParsers для OpenApi. NET, чтобы при синтаксическом анализе документа yaml свойства расширения (свойства с именем x -thing) анализировались в соответствующие классы C#, которые Я написал вместо общего анализа в OpenApiObject.

Так, например, когда я использую OpenApi. NET для анализа следующего документа yaml:

openapi: 3.0.2
info:
  title: 'My interface'
  version: '1.0'
servers:
  - url: https://www.example.com
paths:
  "/student":
    get:
      parameters:
      - name: school
        in: query
        schema:
          type: string
      x-setting:
        name: 'Hello world'
        number: 312
        device: mobile
      responses:
        "200":
          description: Successful
          headers:
            Content-Type:
              schema:
                type: string
          content:
            application/json:
              schema:
                type: string

объект параметра анализируется для C# объекта типа OpenApiParameter, имя имеет тип string, In является перечислением типа ParameterLocation, а схема имеет тип OpenApiSchema.

Но x-setting анализируется для C# объект типа OpenApiObject, имя анализируется как OpenApiString, число анализируется как OpenApiInteger, а устройство как OpenApiString.

Но поскольку у меня уже есть следующий класс c#:

class Setting
    {
        string Name;
        int Number;
        Device Device;
    }

Я хочу, чтобы он был проанализирован для C# объекта типа Setting, name как строка, number как целое число и device как перечисление типа Device. Точно так же, как объект параметра.

Здесь упоминается здесь , что это можно сделать с помощью свойства ExtensionParsers. Но непонятно, как.

Документов нет, а пояснение в комментариях в коде не очень хорошее. Так может кто-нибудь помочь с этим?

Большое спасибо.

1 Ответ

0 голосов
/ 29 января 2020

Вам необходимо предоставить анализатор расширений, чтобы выполнить преобразование из OpenApiObject в собственный класс C#. например,

 var settings = new OpenApiReaderSettings()
            {
                ExtensionParsers = { { "x-foo", (a,v) => {
                        var fooNode = (OpenApiObject)a;
                        return new FooExtension() {
                              Bar = (fooNode["bar"] as OpenApiString)?.Value,
                              Baz = (fooNode["baz"] as OpenApiString)?.Value
                        };
                } } }
            };

https://github.com/microsoft/OpenAPI.NET/blob/3aeeef600d19e4ecfdf0d116725658b1c496eba0/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs#L29

Извините, что нет документов, я, к сожалению, просто не успел.

...