{
  "$defs": {
    "ConstantValue": {
      "properties": {
        "type": {
          "const": "constant",
          "default": "constant",
          "title": "Type",
          "type": "string"
        },
        "quantity": {
          "anyOf": [
            {
              "$ref": "#/$defs/VolumeQuantity"
            },
            {
              "$ref": "#/$defs/IntensityQuantity"
            }
          ],
          "title": "Quantity"
        },
        "value": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/$defs/ParameterRef"
            },
            {
              "$ref": "#/$defs/TTERef"
            }
          ],
          "title": "Value"
        }
      },
      "required": [
        "quantity",
        "value"
      ],
      "title": "ConstantValue",
      "type": "object"
    },
    "Effort": {
      "enum": [
        "work",
        "rest"
      ],
      "title": "Effort",
      "type": "string"
    },
    "IntensityQuantity": {
      "enum": [
        "speed",
        "power",
        "heart_rate",
        "rpe_cr10",
        "rpe_borg"
      ],
      "title": "IntensityQuantity",
      "type": "string"
    },
    "Note": {
      "properties": {
        "type": {
          "const": "note",
          "default": "note",
          "title": "Type",
          "type": "string"
        },
        "text": {
          "title": "Text",
          "type": "string"
        }
      },
      "required": [
        "text"
      ],
      "title": "Note",
      "type": "object"
    },
    "ParameterRef": {
      "description": "Reference to a named parameter, e.g. 75% of FTP.",
      "properties": {
        "percent": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "number"
            }
          ],
          "title": "Percent"
        },
        "of": {
          "title": "Of",
          "type": "string"
        }
      },
      "required": [
        "percent",
        "of"
      ],
      "title": "ParameterRef",
      "type": "object"
    },
    "RampValue": {
      "properties": {
        "type": {
          "const": "ramp",
          "default": "ramp",
          "title": "Type",
          "type": "string"
        },
        "quantity": {
          "anyOf": [
            {
              "$ref": "#/$defs/VolumeQuantity"
            },
            {
              "$ref": "#/$defs/IntensityQuantity"
            }
          ],
          "title": "Quantity"
        },
        "start": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/$defs/ParameterRef"
            },
            {
              "$ref": "#/$defs/TTERef"
            }
          ],
          "title": "Start"
        },
        "end": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/$defs/ParameterRef"
            },
            {
              "$ref": "#/$defs/TTERef"
            }
          ],
          "title": "End"
        }
      },
      "required": [
        "quantity",
        "start",
        "end"
      ],
      "title": "RampValue",
      "type": "object"
    },
    "RangeValue": {
      "properties": {
        "type": {
          "const": "range",
          "default": "range",
          "title": "Type",
          "type": "string"
        },
        "quantity": {
          "anyOf": [
            {
              "$ref": "#/$defs/VolumeQuantity"
            },
            {
              "$ref": "#/$defs/IntensityQuantity"
            }
          ],
          "title": "Quantity"
        },
        "min": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/$defs/ParameterRef"
            },
            {
              "$ref": "#/$defs/TTERef"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Min"
        },
        "max": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "number"
            },
            {
              "$ref": "#/$defs/ParameterRef"
            },
            {
              "$ref": "#/$defs/TTERef"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Max"
        }
      },
      "required": [
        "quantity"
      ],
      "title": "RangeValue",
      "type": "object"
    },
    "Repeat": {
      "properties": {
        "type": {
          "const": "repeat",
          "default": "repeat",
          "title": "Type",
          "type": "string"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        },
        "count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "$ref": "#/$defs/ParameterRef"
            },
            {
              "$ref": "#/$defs/RepeatCount"
            }
          ],
          "title": "Count"
        },
        "content": {
          "items": {
            "discriminator": {
              "mapping": {
                "note": "#/$defs/Note",
                "repeat": "#/$defs/Repeat",
                "step": "#/$defs/Step"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/Step"
              },
              {
                "$ref": "#/$defs/Repeat"
              },
              {
                "$ref": "#/$defs/Note"
              }
            ]
          },
          "title": "Content",
          "type": "array"
        }
      },
      "required": [
        "count",
        "content"
      ],
      "title": "Repeat",
      "type": "object"
    },
    "RepeatCount": {
      "properties": {
        "min": {
          "title": "Min",
          "type": "integer"
        },
        "max": {
          "title": "Max",
          "type": "integer"
        }
      },
      "required": [
        "min",
        "max"
      ],
      "title": "RepeatCount",
      "type": "object"
    },
    "Section": {
      "properties": {
        "type": {
          "const": "section",
          "default": "section",
          "title": "Type",
          "type": "string"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        },
        "phase": {
          "$ref": "#/$defs/SectionPhase"
        },
        "content": {
          "items": {
            "discriminator": {
              "mapping": {
                "note": "#/$defs/Note",
                "repeat": "#/$defs/Repeat",
                "step": "#/$defs/Step"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/Step"
              },
              {
                "$ref": "#/$defs/Repeat"
              },
              {
                "$ref": "#/$defs/Note"
              }
            ]
          },
          "title": "Content",
          "type": "array"
        }
      },
      "required": [
        "phase",
        "content"
      ],
      "title": "Section",
      "type": "object"
    },
    "SectionPhase": {
      "enum": [
        "warmup",
        "main",
        "cooldown"
      ],
      "title": "SectionPhase",
      "type": "string"
    },
    "Sport": {
      "enum": [
        "cycling",
        "running",
        "generic"
      ],
      "title": "Sport",
      "type": "string"
    },
    "Step": {
      "properties": {
        "type": {
          "const": "step",
          "default": "step",
          "title": "Type",
          "type": "string"
        },
        "effort": {
          "$ref": "#/$defs/Effort",
          "default": "work"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Note"
        },
        "volume": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "constant": "#/$defs/ConstantValue",
                  "ramp": "#/$defs/RampValue",
                  "range": "#/$defs/RangeValue"
                },
                "propertyName": "type"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/ConstantValue"
                },
                {
                  "$ref": "#/$defs/RangeValue"
                },
                {
                  "$ref": "#/$defs/RampValue"
                }
              ]
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Volume"
        },
        "intensity": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "constant": "#/$defs/ConstantValue",
                  "ramp": "#/$defs/RampValue",
                  "range": "#/$defs/RangeValue"
                },
                "propertyName": "type"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/ConstantValue"
                },
                {
                  "$ref": "#/$defs/RangeValue"
                },
                {
                  "$ref": "#/$defs/RampValue"
                }
              ]
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Intensity"
        }
      },
      "title": "Step",
      "type": "object"
    },
    "TTERef": {
      "description": "Time-to-exhaustion reference, e.g. power at 5-minute TTE.",
      "properties": {
        "tte": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "number"
            }
          ],
          "title": "Tte"
        }
      },
      "required": [
        "tte"
      ],
      "title": "TTERef",
      "type": "object"
    },
    "VolumeQuantity": {
      "enum": [
        "duration",
        "distance"
      ],
      "title": "VolumeQuantity",
      "type": "string"
    }
  },
  "properties": {
    "$schema": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "$Schema"
    },
    "version": {
      "default": "0.2.0",
      "title": "Version",
      "type": "string"
    },
    "title": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Title"
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Description"
    },
    "sport": {
      "$ref": "#/$defs/Sport"
    },
    "content": {
      "items": {
        "discriminator": {
          "mapping": {
            "note": "#/$defs/Note",
            "repeat": "#/$defs/Repeat",
            "section": "#/$defs/Section",
            "step": "#/$defs/Step"
          },
          "propertyName": "type"
        },
        "oneOf": [
          {
            "$ref": "#/$defs/Step"
          },
          {
            "$ref": "#/$defs/Repeat"
          },
          {
            "$ref": "#/$defs/Section"
          },
          {
            "$ref": "#/$defs/Note"
          }
        ]
      },
      "title": "Content",
      "type": "array"
    }
  },
  "required": [
    "sport",
    "content"
  ],
  "title": "Structured Workout Format (SWF)",
  "type": "object",
  "$id": "https://structuredworkoutformat.dev/schema/0.2.0/workout.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "description": "SWF v0.2.0 \u2014 a JSON format for describing structured endurance workouts."
}
