teo_parser/ast/
pipeline.rs

1use std::cell::RefCell;
2use maplit::btreemap;
3use crate::ast::unit::Unit;
4use crate::{declare_container_node, impl_container_node_defaults, node_child_fn};
5use crate::format::Writer;
6use crate::r#type::Type;
7use crate::traits::resolved::Resolve;
8use crate::traits::write::Write;
9
10declare_container_node!(Pipeline,
11    pub(crate) unit: usize,
12    pub resolved: RefCell<Option<PipelineResolved>>,
13);
14
15impl_container_node_defaults!(Pipeline);
16
17impl Pipeline {
18    node_child_fn!(unit, Unit);
19}
20
21impl Write for Pipeline {
22    fn write<'a>(&'a self, writer: &mut Writer<'a>) {
23        writer.write_children(self, self.children.values());
24    }
25}
26
27#[derive(Debug, Clone)]
28pub struct PipelineResolved {
29    pub items_resolved: Vec<PipelineItemResolved>,
30}
31
32impl PipelineResolved {
33    pub fn new() -> Self {
34        Self { items_resolved: vec![] }
35    }
36}
37
38impl PipelineResolved {
39    pub fn replace_generics(&self, expect: Type) -> PipelineResolved {
40        if let Some((input, output)) = expect.as_pipeline() {
41            let first_input = self.items_resolved.first().unwrap().input_type.clone();
42            let last_output = self.items_resolved.last().unwrap().output_type.clone();
43            let mut generics_map = btreemap! {};
44            if first_input.contains_generics() {
45                first_input.build_generics_map(&mut generics_map, input);
46            }
47            if last_output.contains_generics() {
48                last_output.build_generics_map(&mut generics_map, output);
49            }
50            Self { items_resolved: self.items_resolved.iter().map(|original| PipelineItemResolved {
51                input_type: original.input_type.replace_generics(&generics_map),
52                output_type: original.output_type.replace_generics(&generics_map),
53            }).collect() }
54        } else {
55            self.clone()
56        }
57    }
58}
59
60#[derive(Debug, Clone)]
61pub struct PipelineItemResolved {
62    pub input_type: Type,
63    pub output_type: Type,
64}
65
66impl Resolve<PipelineResolved> for Pipeline {
67
68    fn resolved_ref_cell(&self) -> &RefCell<Option<PipelineResolved>> {
69        &self.resolved
70    }
71}