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}