11use super :: {
22 deserialize:: { deserialize_list, Identifiable } ,
3- inputs:: WorkflowStepInput ,
3+ inputs:: WorkflowStepInputParameter ,
44 outputs:: WorkflowOutputParameter ,
55 requirements:: { deserialize_hints, deserialize_requirements, Requirement } ,
66 CWLDocument , DocumentBase ,
77} ;
8- use serde:: { Deserialize , Serialize } ;
8+ use serde:: { Deserialize , Deserializer , Serialize } ;
9+ use serde_yaml:: Value ;
910use std:: {
1011 collections:: { HashMap , VecDeque } ,
1112 ops:: { Deref , DerefMut } ,
@@ -79,15 +80,9 @@ impl Workflow {
7980
8081 /// Checks whether the `Workflow` has a `WorkflowStep` with an input of id `id`
8182 pub fn has_step_input ( & self , id : & str ) -> bool {
82- self . steps . iter ( ) . any ( |step| {
83- step. in_ . clone ( ) . into_values ( ) . any ( |val| {
84- let src = match val {
85- WorkflowStepInput :: String ( str) => str,
86- WorkflowStepInput :: Parameter ( par) => par. source . unwrap_or_default ( ) ,
87- } ;
88- src == id
89- } )
90- } )
83+ self . steps
84+ . iter ( )
85+ . any ( |step| step. in_ . iter ( ) . any ( |val| val. source == Some ( id. to_string ( ) ) ) )
9186 }
9287
9388 /// Checks whether the `Workflow` has a `WorkflowStep` with an ouput of id `id`
@@ -117,16 +112,11 @@ impl Workflow {
117112 for step in & self . steps {
118113 in_degree. entry ( step. id . clone ( ) ) . or_insert ( 0 ) ;
119114
120- for input in step. in_ . values ( ) {
121- let parts: Vec < & str > = match input {
122- WorkflowStepInput :: String ( string) => string. split ( '/' ) . collect ( ) ,
123- WorkflowStepInput :: Parameter ( parameter) => {
124- if let Some ( source) = & parameter. source {
125- source. split ( '/' ) . collect ( )
126- } else {
127- vec ! [ ]
128- }
129- }
115+ for input in & step. in_ {
116+ let parts: Vec < & str > = if let Some ( source) = & input. source {
117+ source. split ( '/' ) . collect ( )
118+ } else {
119+ vec ! [ ]
130120 } ;
131121
132122 if parts. len ( ) == 2 {
@@ -167,8 +157,10 @@ impl Workflow {
167157pub struct WorkflowStep {
168158 #[ serde( default ) ]
169159 pub id : String ,
170- pub run : StringOrDocument ,
171- pub in_ : HashMap < String , WorkflowStepInput > ,
160+ pub run : StringOrDocument ,
161+ #[ serde( deserialize_with = "deserialize_workflow_inputs" ) ]
162+ pub in_ : Vec < WorkflowStepInputParameter > ,
163+ //pub in_: HashMap<String, WorkflowStepInput>,
172164 pub out : Vec < String > ,
173165
174166 #[ serde( skip_serializing_if = "Vec::is_empty" ) ]
@@ -191,6 +183,41 @@ impl Identifiable for WorkflowStep {
191183 }
192184}
193185
186+ pub fn deserialize_workflow_inputs < ' de , D > ( deserializer : D ) -> Result < Vec < WorkflowStepInputParameter > , D :: Error >
187+ where
188+ D : Deserializer < ' de > ,
189+ {
190+ let value: Value = Deserialize :: deserialize ( deserializer) ?;
191+
192+ let parameters = match value {
193+ Value :: Sequence ( seq) => seq
194+ . into_iter ( )
195+ . map ( |item| {
196+ let param: WorkflowStepInputParameter = serde_yaml:: from_value ( item) . map_err ( serde:: de:: Error :: custom) ?;
197+ Ok ( param)
198+ } )
199+ . collect :: < Result < Vec < _ > , _ > > ( ) ?,
200+ Value :: Mapping ( map) => map
201+ . into_iter ( )
202+ . map ( |( key, value) | {
203+ let id = key. as_str ( ) . ok_or_else ( || serde:: de:: Error :: custom ( "Expected string key" ) ) ?;
204+ let param = if let Value :: String ( source_str) = value {
205+ WorkflowStepInputParameter :: default ( ) . with_id ( id) . with_source ( source_str)
206+ } else {
207+ let mut param: WorkflowStepInputParameter = serde_yaml:: from_value ( value) . map_err ( serde:: de:: Error :: custom) ?;
208+ param. id = id. to_string ( ) ;
209+ param
210+ } ;
211+
212+ Ok ( param)
213+ } )
214+ . collect :: < Result < Vec < _ > , _ > > ( ) ?,
215+ _ => return Err ( serde:: de:: Error :: custom ( "Expected sequence or mapping for inputs" ) ) ,
216+ } ;
217+
218+ Ok ( parameters)
219+ }
220+
194221#[ derive( Serialize , Deserialize , Debug , PartialEq , Clone ) ]
195222#[ serde( untagged) ]
196223pub enum StringOrDocument {
0 commit comments