$base: "https://w3id.org/cwl/salad#"

$namespaces:
  sld:  "https://w3id.org/cwl/salad#"
  dct:  "http://purl.org/dc/terms/"
  rdf:  "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  rdfs: "http://www.w3.org/2000/01/rdf-schema#"
  xsd:  "http://www.w3.org/2001/XMLSchema#"

$graph:

- name: "Schema"
  type: documentation
  doc: |
    # Schema

- name: Documented
  type: record
  abstract: true
  docParent: "#Schema"
  fields:
    - name: doc
      type:
        - string?
        - string[]?
      doc: "A documentation string for this object, or an array of strings which should be concatenated."
      jsonldPredicate: "rdfs:comment"


- name: PrimitiveType
  type: enum
  symbols:
    - "sld:null"
    - "xsd:boolean"
    - "xsd:int"
    - "xsd:long"
    - "xsd:float"
    - "xsd:double"
    - "xsd:string"
  doc:
    - |
      Salad data types are based on Avro schema declarations.  Refer to the
      [Avro schema declaration documentation](https://avro.apache.org/docs/current/spec.html#schemas) for
      detailed information.
    - "null: no value"
    - "boolean: a binary value"
    - "int: 32-bit signed integer"
    - "long: 64-bit signed integer"
    - "float: single precision (32-bit) IEEE 754 floating-point number"
    - "double: double precision (64-bit) IEEE 754 floating-point number"
    - "string: Unicode character sequence"


- name: Any
  type: enum
  symbols: ["#Any"]
  docAfter: "#PrimitiveType"
  doc: |
    The **Any** type validates for any non-null value.


- name: RecordField
  type: record
  extends: Documented
  doc: A field of a record.
  fields:
    - name: name
      type: string
      jsonldPredicate: "@id"
      doc: |
        The name of the field

    - name: type
      type:
        - PrimitiveType
        - RecordSchema
        - EnumSchema
        - ArraySchema
        - string
        - type: array
          items:
            - PrimitiveType
            - RecordSchema
            - EnumSchema
            - ArraySchema
            - string
      jsonldPredicate:
        _id: sld:type
        _type: "@vocab"
        typeDSL: true
        refScope: 2
      doc: |
        The field type


- name: RecordSchema
  type: record
  fields:
    type:
      doc: "Must be `record`"
      type:
        type: enum
        symbols:
          - "sld:record"
      jsonldPredicate:
        _id: "sld:type"
        _type: "@vocab"
        typeDSL: true
        refScope: 2
    fields:
      type: RecordField[]?
      jsonldPredicate:
        _id: sld:fields
        mapSubject: name
        mapPredicate: type
      doc: "Defines the fields of the record."


- name: EnumSchema
  type: record
  doc: |
    Define an enumerated type.
  fields:
    type:
      doc: "Must be `enum`"
      type:
        type: enum
        symbols:
          - "sld:enum"
      jsonldPredicate:
        _id: "sld:type"
        _type: "@vocab"
        typeDSL: true
        refScope: 2
    symbols:
      type: string[]
      jsonldPredicate:
        _id: "sld:symbols"
        _type: "@id"
        identity: true
      doc: "Defines the set of valid symbols."


- name: ArraySchema
  type: record
  fields:
    type:
      doc: "Must be `array`"
      type:
        type: enum
        symbols:
          - "sld:array"
      jsonldPredicate:
        _id: "sld:type"
        _type: "@vocab"
        typeDSL: true
        refScope: 2
    items:
      type:
        - PrimitiveType
        - RecordSchema
        - EnumSchema
        - ArraySchema
        - string
        - type: array
          items:
            - PrimitiveType
            - RecordSchema
            - EnumSchema
            - ArraySchema
            - string
      jsonldPredicate:
        _id: "sld:items"
        _type: "@vocab"
        refScope: 2
      doc: "Defines the type of the array elements."
