@@ -103,6 +103,34 @@ function depth_first_flatten!(container::Union{OrderedDict,Vector})
103103 nothing
104104end
105105
106+ widen_container_type (container:: OrderedDict{K} ) where {K} = convert (OrderedDict{K,Any}, container)
107+ widen_container_type (container:: Vector ) = convert (Vector{Any}, container)
108+
109+ replace_in_template! (template, placeholder, model) = template
110+ function replace_in_template! (container:: Union{OrderedDict,Vector} , placeholder, model)
111+ container = widen_container_type (container)
112+ for (key, value) in pairs (container)
113+ if value == placeholder
114+ container[key] = deepcopy (model)
115+ else
116+ container[key] = replace_in_template! (value, placeholder, model)
117+ end
118+ end
119+ container
120+ end
121+
122+ apply_wrappers! (:: Nothing ) = nothing
123+ function apply_wrappers! (container:: Union{OrderedDict,Vector} )
124+ haskey (container, " WRAPPER" ) || return
125+
126+ wrapper = container[" WRAPPER" ]
127+ delete! (container, " WRAPPER" )
128+ for (key, sub) in pairs (container)
129+ container[key] = replace_in_template! (wrapper, " MODEL" , sub)
130+ end
131+ container
132+ end
133+
106134function parse_network (file)
107135 data = YAML. load_file (file, dicttype= OrderedDict{Any,Any})
108136 dependencies = OrderedDict (keys (data[" Models" ]) .=> map (collect_model_dependencies, values (data[" Models" ])))
@@ -131,9 +159,13 @@ function parse_network(file)
131159 error (" Could not resolve all dependencies" )
132160 end
133161
162+ # apply wrappers to all models
163+ apply_wrappers! (data[" VertexModels" ])
164+ apply_wrappers! (data[" EdgeModels" ])
165+
134166 # with all deps resolve, we can replace the models edge and vertex list
135- recursive_resolve! (data[" Models" ], data[" Vertices " ])
136- recursive_resolve! (data[" Models" ], data[" Edges " ])
167+ recursive_resolve! (data[" Models" ], data[" VertexModels " ])
168+ recursive_resolve! (data[" Models" ], data[" EdgeModels " ])
137169
138170 # traverses the tree and flattens the model properties, i.e. merges
139171 # the local given properties with the parent/template model properties
@@ -144,24 +176,12 @@ end
144176recursive_construct (constructors, data) = _depth_first_construct! (constructors, deepcopy (data))
145177_depth_first_construct! (_, data) = data
146178_depth_first_construct! (_, s:: String ) = startswith (s, " :" ) ? Symbol (s[2 : end ]) : s
147- function _depth_first_construct! (constructors, data:: Vector )
148- if data isa Vector && eltype (data) != = Any
149- data = convert (Vector{Any}, data)
150- end
151- for (key, value) in pairs (data)
152- data[key] = _depth_first_construct! (constructors, value)
153- end
154- data
155- end
156- function _depth_first_construct! (constructors, data:: OrderedDict )
157- if data isa OrderedDict && eltype (values (data)) != = Any
158- data = convert (OrderedDict{eltype (keys (data)), Any}, data)
159- end
160-
179+ function _depth_first_construct! (constructors, data:: Union{OrderedDict,Vector} )
180+ data = widen_container_type (data)
161181 for (key, value) in pairs (data)
162182 data[key] = _depth_first_construct! (constructors, value)
163183 end
164- if haskey (data, " CONSTRUCTOR" )
184+ if data isa OrderedDict && haskey (data, " CONSTRUCTOR" )
165185 if ! haskey (constructors, data[" CONSTRUCTOR" ])
166186 error (" No constructor found for $(data[" CONSTRUCTOR" ]) " )
167187 end
@@ -178,21 +198,26 @@ end
178198
179199function build_network (data, constructors)
180200 vertexm = VertexModel[]
181- for (k, v) in data[" Vertices " ]
201+ for (k, v) in data[" VertexModels " ]
182202 vm = recursive_construct (constructors, v)
183203 set_graphelement! (vm, k)
184204 push! (vertexm, vm)
185205 end
206+
186207 edgem = EdgeModel[]
187- for (k, v) in data[" Vertices " ]
208+ for (k, v) in data[" VertexModels " ]
188209 vm = recursive_construct (constructors, v)
189210
190211 m = match (r" ^(.*)=>(.*)$" , k)
191212 isnothing (m) && error (" Edge key must be of form 'src=>dst', got $k " )
192213 src = tryparse (Int, m[1 ])
193214 dst = tryparse (Int, m[2 ])
194- isnothing (src) && src = m[1 ]
195- isnothing (dst) && src = m[1 ]
215+ if isnothing (src)
216+ src = m[1 ]
217+ end
218+ if isnothing (dst)
219+ dst = m[1 ]
220+ end
196221 set_graphelement! (vm, src, dst)
197222 push! (vertexm, vm)
198223 end
0 commit comments