{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://cocotec.io/schemas/popili/coco-values-v1.schema.json",
  "title": "Coco Values",
  "$defs": {
    "AnyValue": {
      "oneOf": [
        {
          "$ref": "#/$defs/ArrayValue"
        },
        {
          "$ref": "#/$defs/PrimitiveValue"
        },
        {
          "$ref": "#/$defs/SimpleEnumValue"
        },
        {
          "$ref": "#/$defs/StructValue"
        },
        {
          "$ref": "#/$defs/TaggedUnionEnumValue"
        }
      ]
    },
    "ArrayValue": {
      "allOf": [
        {
          "$ref": "#/$defs/BaseValue"
        }
      ],
      "properties": {
        "kind": {
          "const": "ArrayValue"
        },
        "items": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/AnyValue"
          }
        }
      },
      "required": ["items"],
      "unevaluatedProperties": false,
      "title": "ArrayValue"
    },
    "BaseValue": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string"
        }
      },
      "required": ["kind"],
      "title": "Value"
    },
    "CocoDeclRef": {
      "type": "object",
      "properties": {
        "fully_qualified_name": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": ["fully_qualified_name", "name"],
      "additionalProperties": false,
      "title": "CocoDeclRef"
    },
    "EnumValue": {
      "allOf": [
        {
          "$ref": "#/$defs/BaseValue"
        }
      ],
      "properties": {
        "decl": {
          "$ref": "#/$defs/CocoDeclRef"
        }
      },
      "required": ["decl"],
      "title": "EnumValue"
    },
    "PrimitiveValueBool": {
      "allOf": [
        {
          "$ref": "#/$defs/BaseValue"
        }
      ],
      "type": "object",
      "properties": {
        "kind": {
          "const": "PrimitiveValue"
        },
        "bool": {
          "type": "boolean"
        }
      },
      "required": ["bool"],
      "unevaluatedProperties": false,
      "title": "PrimitiveValueBool"
    },
    "PrimitiveValueInt": {
      "allOf": [
        {
          "$ref": "#/$defs/BaseValue"
        }
      ],
      "type": "object",
      "properties": {
        "kind": {
          "const": "PrimitiveValue"
        },
        "int": {
          "type": "integer"
        }
      },
      "required": ["int"],
      "unevaluatedProperties": false,
      "title": "PrimitiveValueInt"
    },
    "PrimitiveValueFloat": {
      "allOf": [
        {
          "$ref": "#/$defs/BaseValue"
        }
      ],
      "type": "object",
      "properties": {
        "kind": {
          "const": "PrimitiveValue"
        },
        "float": {
          "type": "number"
        }
      },
      "required": ["float"],
      "unevaluatedProperties": false,
      "title": "PrimitiveValueFloat"
    },
    "PrimitiveValueDouble": {
      "allOf": [
        {
          "$ref": "#/$defs/BaseValue"
        }
      ],
      "type": "object",
      "properties": {
        "kind": {
          "const": "PrimitiveValue"
        },
        "double": {
          "type": "number"
        }
      },
      "required": ["double"],
      "unevaluatedProperties": false,
      "title": "PrimitiveValueDouble"
    },
    "PrimitiveValueString": {
      "allOf": [
        {
          "$ref": "#/$defs/BaseValue"
        }
      ],
      "type": "object",
      "properties": {
        "kind": {
          "const": "PrimitiveValue"
        },
        "string": {
          "type": "string"
        }
      },
      "required": ["string"],
      "unevaluatedProperties": false,
      "title": "PrimitiveValueString"
    },
    "PrimitiveValue": {
      "oneOf": [
        {
          "$ref": "#/$defs/PrimitiveValueBool"
        },
        {
          "$ref": "#/$defs/PrimitiveValueDouble"
        },
        {
          "$ref": "#/$defs/PrimitiveValueFloat"
        },
        {
          "$ref": "#/$defs/PrimitiveValueInt"
        },
        {
          "$ref": "#/$defs/PrimitiveValueString"
        }
      ]
    },
    "RenderedValue": {
      "type": "object",
      "properties": {
        "value": {
          "$ref": "#/$defs/AnyValue"
        },
        "rendered": {
          "type": "string"
        }
      },
      "required": ["rendered"],
      "additionalProperties": false
    },
    "SimpleEnumValue": {
      "allOf": [
        {
          "$ref": "#/$defs/EnumValue"
        }
      ],
      "properties": {
        "kind": {
          "const": "SimpleEnumValue"
        }
      },
      "unevaluatedProperties": false,
      "title": "SimpleEnumValue"
    },
    "StructValue": {
      "allOf": [
        {
          "$ref": "#/$defs/BaseValue"
        }
      ],
      "properties": {
        "kind": {
          "const": "StructValue"
        },
        "decl": {
          "$ref": "#/$defs/CocoDeclRef"
        },
        "fields": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/$defs/AnyValue"
          }
        }
      },
      "required": ["decl", "fields"],
      "unevaluatedProperties": false,
      "title": "StructValue"
    },
    "TaggedUnionEnumValue": {
      "allOf": [
        {
          "$ref": "#/$defs/EnumValue"
        }
      ],
      "properties": {
        "kind": {
          "const": "TaggedUnionEnumValue"
        },
        "arguments": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/AnyValue"
          }
        }
      },
      "required": ["arguments"],
      "unevaluatedProperties": false,
      "title": "TaggedUnionEnumValue"
    }
  }
}
