teo_parser/ast/
pipeline.rs1use 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}