Skip to main content

xidl_parser/hir/
annotation.rs

1use super::*;
2use serde::{Deserialize, Serialize};
3#[derive(Debug, Serialize, Deserialize, Clone)]
4pub enum Annotation {
5    Id {
6        value: String,
7    },
8    Key {
9        value: Option<String>,
10    },
11    AutoId {
12        value: Option<String>,
13    },
14    Optional {
15        value: Option<String>,
16    },
17    Position {
18        value: String,
19    },
20    Value {
21        value: String,
22    },
23    Extensibility {
24        kind: String,
25    },
26    Final,
27    Appendable,
28    Mutable,
29    MustUnderstand {
30        value: Option<String>,
31    },
32    Default {
33        value: String,
34    },
35    Range {
36        min: String,
37        max: String,
38    },
39    Min {
40        value: String,
41    },
42    Max {
43        value: String,
44    },
45    Unit {
46        value: String,
47    },
48    BitBound {
49        value: String,
50    },
51    External {
52        value: Option<String>,
53    },
54    Nested {
55        value: Option<String>,
56    },
57    Verbatim {
58        language: Option<String>,
59        placement: Option<String>,
60        text: String,
61    },
62    Service {
63        platform: Option<String>,
64    },
65    Oneway {
66        value: Option<String>,
67    },
68    Ami {
69        value: Option<String>,
70    },
71    HashId {
72        value: Option<String>,
73    },
74    DefaultNested {
75        value: Option<String>,
76    },
77    IgnoreLiteralNames {
78        value: Option<String>,
79    },
80    TryConstruct {
81        value: Option<String>,
82    },
83    NonSerialized {
84        value: Option<String>,
85    },
86    DataRepresentation {
87        kinds: Vec<String>,
88    },
89    Topic {
90        name: Option<String>,
91        platform: Option<String>,
92    },
93    Choice,
94    Empty,
95    DdsService,
96    DdsRequestTopic {
97        name: String,
98    },
99    DdsReplyTopic {
100        name: String,
101    },
102    Builtin {
103        name: String,
104        params: Option<AnnotationParams>,
105    },
106    ScopedName {
107        name: ScopedName,
108        params: Option<AnnotationParams>,
109    },
110    DefaultLiteral,
111}
112
113#[derive(Debug, Serialize, Deserialize, Clone)]
114pub enum AnnotationParams {
115    ConstExpr(ConstExpr),
116    Params(Vec<AnnotationParam>),
117    Raw(String),
118}
119
120#[derive(Debug, Serialize, Deserialize, Clone)]
121pub struct AnnotationParam {
122    pub ident: String,
123    pub value: Option<ConstExpr>,
124}
125
126pub fn annotation_id_value(annotations: &[Annotation]) -> Option<u32> {
127    for annotation in annotations {
128        if let Annotation::Id { value } = annotation {
129            if let Ok(value) = value.parse::<u32>() {
130                return Some(value);
131            }
132        }
133    }
134    None
135}
136
137pub fn expand_annotations(values: Vec<crate::typed_ast::AnnotationAppl>) -> Vec<Annotation> {
138    let mut out = Vec::new();
139    for value in values {
140        push_annotation(&mut out, value);
141    }
142    out
143}
144
145fn push_annotation(out: &mut Vec<Annotation>, mut value: crate::typed_ast::AnnotationAppl) {
146    let extra = std::mem::take(&mut value.extra);
147    out.push(Annotation::from(value));
148    for item in extra {
149        push_annotation(out, item);
150    }
151}
152
153impl From<crate::typed_ast::AnnotationAppl> for Annotation {
154    fn from(value: crate::typed_ast::AnnotationAppl) -> Self {
155        let params = value.params.map(Into::into);
156        match value.name {
157            crate::typed_ast::AnnotationName::ScopedName(name) => Self::ScopedName {
158                name: name.into(),
159                params,
160            },
161            crate::typed_ast::AnnotationName::Builtin(name) => match value.builtin {
162                Some(builtin) => super::annotation_builtin::from_builtin_annotation(builtin)
163                    .unwrap_or(Self::Builtin { name, params }),
164                None => Self::Builtin { name, params },
165            },
166        }
167    }
168}
169
170impl From<crate::typed_ast::AnnotationParams> for AnnotationParams {
171    fn from(value: crate::typed_ast::AnnotationParams) -> Self {
172        match value {
173            crate::typed_ast::AnnotationParams::ConstExpr(expr) => Self::ConstExpr(expr.into()),
174            crate::typed_ast::AnnotationParams::Params(params) => {
175                Self::Params(params.into_iter().map(Into::into).collect())
176            }
177            crate::typed_ast::AnnotationParams::Raw(value) => Self::Raw(value),
178        }
179    }
180}
181
182impl From<crate::typed_ast::AnnotationApplParam> for AnnotationParam {
183    fn from(value: crate::typed_ast::AnnotationApplParam) -> Self {
184        Self {
185            ident: value.ident.0,
186            value: value.value.map(Into::into),
187        }
188    }
189}