1- use yaml_rust2 :: Yaml ;
1+ use crate :: pdl :: ast :: PdlBlock ;
22
33/// Extract models referenced by the programs
4- pub fn extract_models ( programs : Vec < Yaml > ) -> Vec < String > {
5- extract_values ( programs , "model" )
4+ pub fn extract_models ( program : & PdlBlock ) -> Vec < String > {
5+ extract_values ( program , "model" )
66}
77
88/// Take a list of Yaml fragments and produce a vector of the string-valued entries of the given field
9- pub fn extract_values ( programs : Vec < Yaml > , field : & str ) -> Vec < String > {
10- let mut values = programs
11- . into_iter ( )
12- . flat_map ( |p| extract_one_values ( p, field) )
13- . collect :: < Vec < String > > ( ) ;
9+ pub fn extract_values ( program : & PdlBlock , field : & str ) -> Vec < String > {
10+ let mut values = vec ! [ ] ;
11+ extract_values_iter ( program, field, & mut values) ;
1412
1513 // A single program may specify the same model more than once. Dedup!
1614 values. sort ( ) ;
@@ -20,38 +18,37 @@ pub fn extract_values(programs: Vec<Yaml>, field: &str) -> Vec<String> {
2018}
2119
2220/// Take one Yaml fragment and produce a vector of the string-valued entries of the given field
23- fn extract_one_values ( program : Yaml , field : & str ) -> Vec < String > {
24- let mut values: Vec < String > = Vec :: new ( ) ;
25-
21+ fn extract_values_iter ( program : & PdlBlock , field : & str , values : & mut Vec < String > ) {
2622 match program {
27- Yaml :: Hash ( h) => {
28- for ( key, val) in h {
29- match key {
30- Yaml :: String ( f) if f == field => match & val {
31- Yaml :: String ( m) => {
32- values. push ( m. to_string ( ) ) ;
33- }
34- _ => { }
35- } ,
36- _ => { }
37- }
38-
39- for m in extract_one_values ( val, field) {
40- values. push ( m)
41- }
42- }
23+ PdlBlock :: Model ( b) => values. push ( b. model . clone ( ) ) ,
24+ PdlBlock :: Repeat ( b) => {
25+ extract_values_iter ( & b. repeat , field, values) ;
4326 }
44-
45- Yaml :: Array ( a) => {
46- for val in a {
47- for m in extract_one_values ( val, field) {
48- values. push ( m)
49- }
27+ PdlBlock :: Message ( b) => {
28+ extract_values_iter ( & b. content , field, values) ;
29+ }
30+ PdlBlock :: Array ( b) => b
31+ . array
32+ . iter ( )
33+ . for_each ( |p| extract_values_iter ( p, field, values) ) ,
34+ PdlBlock :: Text ( b) => b
35+ . text
36+ . iter ( )
37+ . for_each ( |p| extract_values_iter ( p, field, values) ) ,
38+ PdlBlock :: LastOf ( b) => b
39+ . last_of
40+ . iter ( )
41+ . for_each ( |p| extract_values_iter ( p, field, values) ) ,
42+ PdlBlock :: If ( b) => {
43+ extract_values_iter ( & b. then , field, values) ;
44+ if let Some ( else_) = & b. else_ {
45+ extract_values_iter ( else_, field, values) ;
5046 }
5147 }
52-
48+ PdlBlock :: Object ( b) => b
49+ . object
50+ . values ( )
51+ . for_each ( |p| extract_values_iter ( p, field, values) ) ,
5352 _ => { }
5453 }
55-
56- values
5754}
0 commit comments