| 32 | } |
| 33 | |
| 34 | fn find_dir<'a>( |
| 35 | name: &str, |
| 36 | nodes: &'a mut Vec<ProjectObjectNode>, |
| 37 | ) -> &'a mut Vec<ProjectObjectNode> { |
| 38 | if let Some(index) = nodes |
| 39 | .iter() |
| 40 | .position(|node| matches!(node, ProjectObjectNode::Dir(dir_name, _) if dir_name == name)) |
| 41 | { |
| 42 | if let ProjectObjectNode::Dir(_, children) = &mut nodes[index] { |
| 43 | return children; |
| 44 | } |
| 45 | } else { |
| 46 | nodes.push(ProjectObjectNode::Dir(name.to_string(), vec![])); |
| 47 | if let Some(ProjectObjectNode::Dir(_, children)) = nodes.last_mut() { |
| 48 | return children; |
| 49 | } |
| 50 | } |
| 51 | unreachable!(); |
| 52 | } |
| 53 | |
| 54 | fn build_nodes(units: &mut [ObjectConfig]) -> Vec<ProjectObjectNode> { |
| 55 | let mut nodes = vec![]; |