@startuml
!include plantuml_options.txt

package galaxy.tool_util.parameters.state {

class ToolState {
state_representation: str
input_state: Dict[str, Any]
+ validate(parameters: ToolParameterBundle)
+ {abstract} _to_base_model(parameters: ToolParameterBundle): Optional[Type[BaseModel]]
}

class RelaxedRequestToolState {
state_representation = "request"
+ _to_base_model(parameters: ToolParameterBundle): Type[BaseModel]
}
note bottom: Object references of the form \n{src: "hda", id: <encoded_id>}.\n Allow mapping/reduce constructs. Relaxed syntax to allow some of the odd\nstuff allowed in legacy tool input format.

class RequestToolState {
state_representation = "request"
+ _to_base_model(parameters: ToolParameterBundle): Type[BaseModel]
}
note bottom: Object references of the form \n{src: "hda", id: <encoded_id>}.\n Allow mapping/reduce constructs.

class RequestInternalToolState {
state_representation = "request_internal"
+ _to_base_model(parameters: ToolParameterBundle): Type[BaseModel]
}
note bottom: Object references of the form \n{src: "hda", id: <decoded_id>}.\n Allow mapping/reduce constructs. Allows URI src dicts.

class RequestInternalDereferencedToolState {
state_representation = "request_internal"
+ _to_base_model(parameters: ToolParameterBundle): Type[BaseModel]
}
note bottom: Object references of the form \n{src: "hda", id: <decoded_id>}.\n Allow mapping/reduce constructs. No URI src dicts - all converted to HDAs.

class JobInternalToolState {
state_representation = "job_internal"
+ _to_base_model(parameters: ToolParameterBundle): Type[BaseModel]

}
note bottom: Object references of the form \n{src: "hda", id: <decoded_id>}.\n Mapping constructs expanded out.\n (Defaults are inserted?)

class TestCaseToolState {
state_representation = "test_case"
+ _to_base_model(input_models: ToolParameterBundle): Type[BaseModel]    
}
note bottom: Object references of the form file name and URIs.\n Mapping constructs not allowed.\n

class WorkflowStepToolState {
state_representation = "workflow_step"
+ _to_base_model(input_models: ToolParameterBundle): Type[BaseModel]    
}
note bottom: Nearly everything optional except conditional discriminators.\n

class WorkflowStepLinkedToolState {
state_representation = "workflow_step_linked"
+ _to_base_model(input_models: ToolParameterBundle): Type[BaseModel]    
}
note bottom: Expect pre-process ``in`` dictionaries and bring in representation\n of links and defaults and validate them in model.\n

ToolState <|-- RelaxedRequestToolState
ToolState <|-- RequestToolState
ToolState <|-- RequestInternalToolState
ToolState <|-- RequestInternalDereferencedToolState
ToolState <|-- JobInternalToolState
ToolState <|-- TestCaseToolState
ToolState <|-- WorkflowStepToolState
ToolState <|-- WorkflowStepLinkedToolState

RelaxedRequestToolState - RequestToolState : strictify >

RequestToolState - RequestInternalToolState : decode >

RequestInternalToolState - RequestInternalDereferencedToolState : dereference > 

RequestInternalDereferencedToolState o-- JobInternalToolState : expand >

WorkflowStepToolState o-- WorkflowStepLinkedToolState : preprocess_links_and_defaults >
}
@enduml