type: map mapping: dictionary: type: seq sequence: - type: map mapping: name: &valid_answer_name type: str required: yes namespace: "answers" pattern: &valid_name_pattern /^[a-zA-Z][a-zA-Z0-9_]+$/ description: type: str default: type: text map: type: seq required: yes sequence: - type: map mapping: value: type: text required: yes unique: yes label: type: str required: yes unique: yes description: type: str questions: type: seq sequence: - type: map mapping: "name": &valid_element_name namespace: [ "elements", "questions" ] type: str required: yes pattern: *valid_name_pattern "prompt": type: str required: yes "description": type: str "unit": type: str "type": type: str required: yes enum: - string - integer - float - number - text - boolean - date - time - dictionary - datetime "options": type: map mapping: "soft range": "type": str # FIXME: need date/time ranges too pattern: &numeric_range /^(?:0|[-+]?(?:[1-9]|[0-9]{2,})(?:\.[0-9]+)?|[-]?Infinity)\.\.\.*(?:0|[-+]?(?:[1-9]|[0-9]{2,})(?:\.[0-9]+)?|[+]?Infinity)$/ "hard range": type: str pattern: *numeric_range "definition": &valid_answer_ref type: str pattern: *valid_name_pattern included: "answers" "cardinality": type: text "pattern": type: str "length": type: text "sections": type: seq sequence: - type: map mapping: "name": <<: *valid_element_name namespace: [ "elements", "sections" ] "description": type: str "header": type: str "footer": type: str "content": type: seq sequence: - type: map mapping: name: &valid_element_ref type: str required: yes pattern: *valid_name_pattern included: "elements" required: type: bool dependency: type: map mapping: question: &valid_question_ref type: str required: yes pattern: *valid_name_pattern included: "questions" answer: type: any required: yes forms: type: seq sequence: - type: map mapping: name: <<: *valid_element_name namespace: "elements" description: type: str header: type: str footer: type: str enrollment: type: bool multiple: type: bool index: type: str pattern: *valid_name_pattern content: type: seq sequence: - type: map mapping: name: *valid_element_ref repeated: &repeated_item type: text pattern: &item_range_pattern /^(?:Infinity|[1-9]|[0-9]{2,}|[+]?(?:[1-9]|[0-9]{2,})\.\.[+]?([1-9]|[0-9]{2,}|Infinity))$/ required: type: bool dependency: type: map mapping: section: type: str required: no pattern: *valid_name_pattern included: "elements" question: *valid_question_ref answer: type: any required: yes