analyzer:
  subst:
    "%CLIENT_RELEASE_LABEL%": r0
    "%CLIENT_MAJOR_VERSION%": r0
  identifiers:
    signed: signedData
    unsigned: unsignedData
    PushRule/default: isDefault
    default: defaultVersion # getCapabilities/RoomVersionsCapability
    origin_server_ts: originServerTimestamp # Instead of originServerTs
    start: begin # Because start() is a method in BaseJob
    m.upload.size: uploadSize
    m.homeserver: homeserver
    m.identity_server: identityServer
    m.change_password: changePassword
    m.room_versions: roomVersions
    AuthenticationData/additionalProperties: authInfo
    /^/(Location|Protocol|User)$/: 'ThirdParty$1'
    # Change some response names
    /requestTokenTo.*</data/: response
    requestOpenIdToken</data: tokenData
    getDevice</data: device
    getFilter</data: filter
    getProtocols</data: protocols
    getOneRoomEvent</data: event
    getRoomState</data: events
    getPushRule</data: pushRule
    # These parameters are deprecated and unused in Quotient; so drop them
    login>/user: ""
    login>/medium: ""
    login>/address: ""
    login</home_server: ""
    register</home_server: ""

  # Structure inside `types`:
  # - swaggerType: <targetTypeSpec>
  # OR
  # - swaggerType:
  #   - swaggerFormat: <targetTypeSpec>
  #   - /swaggerFormatRegEx/: <targetTypeSpec>
  #   - //: <targetTypeSpec> # default, if the format doesn't mach anything above
  # WHERE
  # targetTypeSpec = targetType OR
  #   { type: targetType, imports: <filename OR [ filenames... ]>, <other attributes...> }
  # swaggerType can be +set/+on pair; attributes from the map under +set
  # are added to each type from the sequence under +on.
  types:
  - +set: &UseOmittable
      useOmittable:
      omittedValue: 'none' # Quotient::none in lib/omittable.h
    +on:
    - integer:
      - int64: qint64
      - int32: qint32
      - //: int
    - number:
      - float: float
      - //: double
    - boolean: bool
  - string:
    - byte: &ByteStream
        type: QIODevice*
        imports: <QtCore/QIODevice>
    - binary: *ByteStream
    - +set: { avoidCopy: }
      +on:
      - date:
          type: QDate
          initializer: QDate::fromString("{{defaultValue}}")
      - dateTime:
          type: QDateTime
          initializer: QDateTime::fromString("{{defaultValue}}")
      - uri:
          type: QUrl
          initializer: QUrl::fromEncoded("{{defaultValue}}")
      - //: &QString
          type: QString
          initializer: QStringLiteral("{{defaultValue}}")
          isString:
  - file: *ByteStream
  - +set: { avoidCopy: }
    +on:
    - object: &QJsonObject { type: QJsonObject }
    - $ref:
      - +set:
          moveOnly:
        +on:
        - /state_event.yaml$/:
            type: StateEventPtr
            imports: '"events/stateevent.h"'
        - /(room|client)_event.yaml$/:
            type: RoomEventPtr
            imports: '"events/roomevent.h"'
        - /event(_without_room_id)?.yaml$/:
            type: EventPtr
            imports: '"events/event.h"'
      - +set:
          # This renderer applies to everything actually $ref'ed
          # (not substituted)
          _importRenderer: '"{{#segments}}{{_}}{{#_join}}/{{/_join}}{{/segments}}.h"'
        +on:
        - '/^(\./)?definitions/request_email_validation.yaml$/':
            title: EmailValidationData
        - '/^(\./)?definitions/request_msisdn_validation.yaml$/':
            title: MsisdnValidationData
        - /_filter.yaml$/: # Event/RoomEventFilters do NOT need Omittable<>

          # Despite being used in two calls, it's more practical to have those
          # fields available as getters right from the respective job classes
        - /public_rooms_response.yaml$/: { _inline: true }

          # list_public_rooms.yaml (via public_rooms_response.yaml) and
          # space_hierarchy.yaml use public_rooms_chunk.yaml as a common base
          # structure, adding (space_hiearchy) or overriding
          # (public_rooms_response) fields for their purposes. The spec text
          # confusingly ends up with having two different structures named
          # "PublicRoomsChunk". To make sure the types are distinct in
          # libQuotient, this common base is inlined into the actually used
          # data structures (that have distinct names) defined
          # in space_hierarchy.h and public_rooms_response.h, respectively
        - /public_rooms_chunk.yaml$/: { _inline: true }
        - //: *UseOmittable # Also apply "avoidCopy" to all other ref'ed types
    - schema:
      - getTurnServer<: *QJsonObject # It's used as an opaque JSON object
#      - defineFilter>: &Filter # Force folding into a structure
#          type: Filter
#          imports: '"csapi/definitions/sync_filter.h"'
#      - getFilter<: *Filter
      - StrippedChildStateEvent: void # only used in an array, see below
      - RoomFilter: # A structure inside Filter, same story as with *_filter.yaml
      - OneTimeKeys:
          type: OneTimeKeys
          imports: '"e2ee/e2ee.h"'
      - //: *UseOmittable
    - array:
      - string: QStringList
      - +set: { moveOnly: }
        +on:
        - /^Notification|Result|ChildRoomsChunk$/: "std::vector<{{1}}>"
        - /^StrippedChildStateEvent$|state_event.yaml$/:
            type: StateEvents
            imports: '"events/stateevent.h"' # For StrippedChildStateEvent
        - /(room|client)_event.yaml$/: RoomEvents
        - /event(_without_room_id)?.yaml$/: Events
      - //: "QVector<{{1}}>"
    - map: # `additionalProperties` in OpenAPI
      - RoomState:
          type: "UnorderedMap<QString, {{1}}>"
          moveOnly:
      - /.+/: "QHash<QString, {{1}}>"
      - //: QVariantHash # QJsonObject?..
    - variant: # A sequence `type` or a 'oneOf' group in OpenAPI
      - /^string,null|null,string$/: *QString
      - //: QVariant

  #operations:

mustache:
#  delimiter: '%| |%' # or something else instead of '{{ }}'
  constants:
    # Syntax elements used by GTAD
#    _quote: '"' # Common quote for left and right
#    _leftQuote: '"'
#    _rightQuote: '"_ls'
    _comment: '//'
    copyrightName: Kitsune Ral
    copyrightEmail: <kitsune-ral@users.sf.net>

  partials:
    _typeRenderer: "{{#scope}}{{scopeCamelCase}}Job::{{/scope}}{{>name}}"
    omittedValue: '{}' # default value to initialize omitted parameters with
    initializer: '{{defaultValue}}'
    cjoin: '{{#hasMore}}, {{/hasMore}}'

    openOmittable:
      "{{^required?}}{{#useOmittable}}\
        {{^defaultValue}}Omittable<{{/defaultValue}}\
      {{/useOmittable}}{{/required?}}"
    closeOmittable:
      "{{^required?}}{{#useOmittable}}\
        {{^defaultValue}}>{{/defaultValue}}\
      {{/useOmittable}}{{/required?}}"

    maybeOmittableType: "{{>openOmittable}}{{dataType.name}}{{>closeOmittable}}"
    qualifiedMaybeOmittableType:
      "{{>openOmittable}}{{dataType.qualifiedName}}{{>closeOmittable}}"

    maybeCrefType:
      "{{#avoidCopy}}const {{/avoidCopy}}{{>maybeOmittableType}}{{#avoidCopy}}&{{/avoidCopy}}"

    maybeCrefJsonObject:
      "{{^propertyMap}}const QJsonObject&{{/propertyMap}}\
      {{#propertyMap}}QJsonObject{{/propertyMap}}"

    takeOrValue:
      "{{#propertyMap}}take{{/propertyMap}}{{^propertyMap}}value{{/propertyMap}}"
    takeOrLoad: "{{#moveOnly}}take{{/moveOnly}}{{^moveOnly}}load{{/moveOnly}}"

    initializeDefaultValue:
      "{{#defaultValue}}{{>initializer}}{{/defaultValue}}\
      {{^defaultValue}}{{>omittedValue}}{{/defaultValue}}"

    # No inner indents in folded values!

    joinedParamDecl: >-
      {{>maybeCrefType}} {{paramName}}
      {{^required?}} = {{>initializeDefaultValue}}{{/required?}}{{>cjoin}}
    joinedParamDef: "{{>maybeCrefType}} {{paramName}}{{>cjoin}}"

    passPathAndMaybeQuery: >-
      makePath("{{basePathWithoutHost}}"{{#pathParts}},
        {{_}}{{/pathParts}}){{#queryParams?}},
      queryTo{{camelCaseOperationId}}(
      {{#queryParams}}{{paramName}}{{>cjoin}}{{/queryParams}}){{/queryParams?}}

    nonInlineResponseSignature: |-
      {{>docCommentShort}}
      {{>maybeOmittableType}} {{paramName}}(){{^moveOnly}} const{{/moveOnly}}

    # Doc-comment blocks. Comment indent is managed by clang-format
    # (without clang-format there'd have to be a separate partial definition
    # for each indent...) but we take care of line breaks to maintain
    # some sanity even before clang-format

    # This is for structures that don't expect a summary (e.g., JSON schema)
    docCommentShort: |-
      {{#description}}
      /// {{_}}{{/description}}
    # For structures with the summary, a common partial for summary is here;
    # the main part is different in different places
    docCommentSummary: |-
      {{#summary}} \brief {{summary}}
       *{{/summary}}

  templates:
    data:
      .h: "{{>data.h.mustache}}"
    api:
      .h: "{{>operation.h.mustache}}"
      .cpp: "{{>operation.cpp.mustache}}"

  #outFilesList: apifiles.txt