swamp_analyzer/
attributes.rs1use crate::Analyzer;
6use swamp_attributes::{Attribute, AttributeArg, AttributeIdentifier, AttributeValue, Attributes};
7
8impl Analyzer<'_> {
9    #[must_use]
10    pub fn analyze_attributes(&self, attributes: &[swamp_ast::Attribute]) -> Attributes {
11        let items = attributes
12            .iter()
13            .map(|swamp_attr| self.analyze_attribute(swamp_attr))
14            .collect();
15
16        Attributes(items)
17    }
18
19    #[must_use]
20    pub fn analyze_attribute(&self, parsed: &swamp_ast::Attribute) -> Attribute {
21        Attribute {
22            path: self.analyze_attribute_identifier(&parsed.path),
23            args: self.analyze_attribute_arguments(&parsed.args),
24            node: self.to_node(&parsed.node),
25        }
26    }
27
28    fn analyze_attribute_identifier(
29        &self,
30        attribute_identifier: &swamp_ast::QualifiedIdentifier,
31    ) -> AttributeIdentifier {
32        let text = self.get_text(&attribute_identifier.name).to_string();
33        AttributeIdentifier { name: text }
34    }
35
36    fn analyze_attribute_arguments(&self, args: &[swamp_ast::AttributeArg]) -> Vec<AttributeArg> {
37        args.iter()
38            .map(|ast_arg| match ast_arg {
39                swamp_ast::AttributeArg::Path(attribute_identifier) => {
40                    let analyzed_attribute_identifier =
41                        self.analyze_attribute_identifier(attribute_identifier);
42                    AttributeArg::Path(analyzed_attribute_identifier)
43                }
44                swamp_ast::AttributeArg::Literal(attribute_value) => match attribute_value {
45                    swamp_ast::AttributeValue::Literal(ast_node, ast_literal_kind) => {
46                        let text = self.get_text(ast_node).to_string();
47                        let converted_value = match ast_literal_kind {
48                            swamp_ast::AttributeLiteralKind::Int => {
49                                let i = Self::str_to_int(&text).unwrap();
50                                AttributeValue::Int(i)
51                            }
52                            swamp_ast::AttributeLiteralKind::String(s) => {
53                                AttributeValue::String(s.clone())
54                            }
55                            swamp_ast::AttributeLiteralKind::Bool => {
56                                let b = Self::str_to_bool(&text).unwrap();
57                                AttributeValue::Bool(b)
58                            }
59                        };
60                        AttributeArg::Literal(converted_value)
61                    }
62                    swamp_ast::AttributeValue::Path(attribute_identifier) => {
63                        let analyzed_attribute_identifier =
64                            self.analyze_attribute_identifier(attribute_identifier);
65                        AttributeArg::Path(analyzed_attribute_identifier)
66                    }
67                    swamp_ast::AttributeValue::Function(attribute_identifier, args) => {
68                        let analyzed_attribute_identifier =
69                            self.analyze_attribute_identifier(attribute_identifier);
70                        let analyzed_args = self.analyze_attribute_arguments(args);
71
72                        AttributeArg::Function(analyzed_attribute_identifier, analyzed_args)
73                    }
74                },
75                swamp_ast::AttributeArg::Function(attribute_identifier, arguments) => {
76                    let attribute_identifier =
77                        self.analyze_attribute_identifier(attribute_identifier);
78                    let args = self.analyze_attribute_arguments(arguments);
79                    AttributeArg::Function(attribute_identifier, args)
80                }
81            })
82            .collect()
83    }
84}