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}