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: ""

  # 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/util.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}}")
      - //: &QString
          type: QString
          initializer: QStringLiteral("{{defaultValue}}")
          isString:
  - file: *ByteStream
  - +set: { avoidCopy: }
    +on:
    - object: &QJsonObject { type: QJsonObject }
    - $ref:
      - +set:
          moveOnly:
          imports: '"events/eventloader.h"'
        +on:
        - /state_event.yaml$/: StateEventPtr
        - /room_event.yaml$/: RoomEventPtr
        - /event.yaml$/: EventPtr
      - /m\.room\.member/: void # Skip resolving; see EventsArray<> below
      - +set:
          # This renderer actually applies to all $ref things
          _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<>
        - /public_rooms_response.yaml$/: { _inline: true }
        - //: *UseOmittable # Also apply "avoidCopy" to all other ref'ed types
    - schema:
      - getTurnServer<: *QJsonObject # It's used as an opaque JSON object
      - PublicRoomResponse: { _inline: true }
#      - defineFilter>: &Filter # Force folding into a structure
#          type: Filter
#          imports: '"csapi/definitions/sync_filter.h"'
#      - getFilter<: *Filter
      - RoomFilter: # A structure inside Filter, same story as with *_filter.yaml
      - //: *UseOmittable
    - array:
      - string: QStringList
      - +set: { moveOnly: }
        +on:
        - /^Notification|Result$/:
            type: "std::vector<{{1}}>"
            imports: '"events/eventloader.h"'
        - /m\.room\.member/: # Only used in an array (see also above)
            type: "EventsArray<RoomMemberEvent>"
            imports: '"events/roommemberevent.h"'
        - /state_event.yaml$/: StateEvents
        - /room_event.yaml$/: RoomEvents
        - /event.yaml$/: Events
      - //: "QVector<{{1}}>"
    - map: # `additionalProperties` in OpenAPI
      - RoomState:
          type: "UnorderedMap<QString, {{1}}>"
          moveOnly:
      - /.+/: "QHash<QString, {{1}}>"
      - //: QVariantHash
    - variant: # A sequence `type` (multitype) 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: '"'
    _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}}"

    ref: "{{#avoidCopy}}&{{/avoidCopy}}{{#moveOnly}}&&{{/moveOnly}}"
    maybeCrefType:
      "{{#avoidCopy}}const {{/avoidCopy}}{{>maybeOmittableType}}{{>ref}}"
    qualifiedMaybeCrefType:
      "{{#avoidCopy}}const {{/avoidCopy}}{{>qualifiedMaybeOmittableType}}{{>ref}}"

    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: >-
      QStringLiteral("{{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