1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { Resource, ResourceKind } from "./resource";
6 import { safeLoad } from 'js-yaml';
8 export interface WorkflowResource extends Resource {
9 kind: ResourceKind.WORKFLOW;
14 export interface WorkflowResoruceDefinition {
16 graph?: Array<Workflow | CommandLineTool>;
17 $graph?: Array<Workflow | CommandLineTool>;
19 export interface Workflow {
23 inputs: CommandInputParameter[];
28 export interface CommandLineTool {
29 class: 'CommandLineTool';
31 inputs: CommandInputParameter[];
35 export type CommandInputParameter =
36 BooleanCommandInputParameter |
37 IntCommandInputParameter |
38 LongCommandInputParameter |
39 FloatCommandInputParameter |
40 DoubleCommandInputParameter |
41 StringCommandInputParameter |
42 FileCommandInputParameter |
43 DirectoryCommandInputParameter |
44 StringArrayCommandInputParameter |
45 IntArrayCommandInputParameter |
46 FloatArrayCommandInputParameter |
47 FileArrayCommandInputParameter |
48 DirectoryArrayCommandInputParameter |
49 EnumCommandInputParameter;
60 DIRECTORY = 'Directory',
63 export interface CommandInputEnumSchema {
70 export interface CommandInputArraySchema<ItemType> {
76 export interface File {
83 export interface Directory {
84 class: CWLType.DIRECTORY;
90 export interface GenericCommandInputParameter<Type, Value> {
93 doc?: string | string[];
95 type?: Type | Array<Type | CWLType.NULL>;
99 export type GenericArrayCommandInputParameter<Type, Value> = GenericCommandInputParameter<CommandInputArraySchema<Type>, Value[]>;
101 export type BooleanCommandInputParameter = GenericCommandInputParameter<CWLType.BOOLEAN, boolean>;
102 export type IntCommandInputParameter = GenericCommandInputParameter<CWLType.INT, number>;
103 export type LongCommandInputParameter = GenericCommandInputParameter<CWLType.LONG, number>;
104 export type FloatCommandInputParameter = GenericCommandInputParameter<CWLType.FLOAT, number>;
105 export type DoubleCommandInputParameter = GenericCommandInputParameter<CWLType.DOUBLE, number>;
106 export type StringCommandInputParameter = GenericCommandInputParameter<CWLType.STRING, string>;
107 export type FileCommandInputParameter = GenericCommandInputParameter<CWLType.FILE, File>;
108 export type DirectoryCommandInputParameter = GenericCommandInputParameter<CWLType.DIRECTORY, Directory>;
109 export type EnumCommandInputParameter = GenericCommandInputParameter<CommandInputEnumSchema, string>;
111 export type StringArrayCommandInputParameter = GenericArrayCommandInputParameter<CWLType.STRING, string>;
112 export type IntArrayCommandInputParameter = GenericArrayCommandInputParameter<CWLType.INT, string>;
113 export type FloatArrayCommandInputParameter = GenericArrayCommandInputParameter<CWLType.FLOAT, string>;
114 export type FileArrayCommandInputParameter = GenericArrayCommandInputParameter<CWLType.FILE, File>;
115 export type DirectoryArrayCommandInputParameter = GenericArrayCommandInputParameter<CWLType.DIRECTORY, Directory>;
117 export type WorkflowInputsData = {
118 [key: string]: boolean | number | string | File | Directory;
120 export const parseWorkflowDefinition = (workflow: WorkflowResource): WorkflowResoruceDefinition => {
121 const definition = safeLoad(workflow.definition);
125 export const getWorkflowInputs = (workflowDefinition: WorkflowResoruceDefinition) => {
126 if (workflowDefinition.graph) {
127 const mainWorkflow = workflowDefinition.graph.find(item => item.class === 'Workflow' && item.id === '#main');
129 ? mainWorkflow.inputs
132 const mainWorkflow = workflowDefinition.$graph!.find(item => item.class === 'Workflow' && item.id === '#main');
134 ? mainWorkflow.inputs
139 export const getInputLabel = (input: CommandInputParameter) => {
140 return `${input.label || input.id}`;
143 export const isRequiredInput = ({ type }: CommandInputParameter) => {
144 if (type instanceof Array) {
145 for (const t of type) {
146 if (t === CWLType.NULL) {
154 export const isPrimitiveOfType = (input: GenericCommandInputParameter<any, any>, type: CWLType) =>
155 input.type instanceof Array
156 ? input.type.indexOf(type) > -1
157 : input.type === type;
159 export const isArrayOfType = (input: GenericCommandInputParameter<any, any>, type: CWLType) =>
160 typeof input.type === 'object' &&
161 input.type.type === 'array'
162 ? input.type.items === type
165 export const stringifyInputType = ({ type }: CommandInputParameter) => {
166 if (typeof type === 'string') {
168 } else if (type instanceof Array) {
169 return type.join(' | ');
170 } else if (typeof type === 'object') {
171 if (type.type === 'enum') {
173 } else if (type.type === 'array') {
174 return `${type.items}[]`;