xidl_parser/hir/annotation/
mod.rs1use super::*;
2use serde::{Deserialize, Serialize};
3use std::str::FromStr;
4
5mod convert;
6#[cfg(test)]
7mod tests;
8
9pub use convert::{
10 annotation_id_value, annotation_name, annotation_params, effective_wire_name,
11 expand_annotations, field_rename, is_skipped, normalize_annotation_params, rename_all,
12};
13#[cfg(test)]
14use convert::{apply_rename_rule, render_annotation_const_expr};
15#[derive(Debug, Serialize, Deserialize, Clone)]
16pub enum Annotation {
17 Id {
18 value: String,
19 },
20 Key {
21 value: Option<String>,
22 },
23 AutoId {
24 value: Option<String>,
25 },
26 Optional {
27 value: Option<String>,
28 },
29 Position {
30 value: String,
31 },
32 Value {
33 value: String,
34 },
35 Extensibility {
36 kind: String,
37 },
38 Final,
39 Appendable,
40 Mutable,
41 MustUnderstand {
42 value: Option<String>,
43 },
44 Default {
45 value: String,
46 },
47 Range {
48 min: String,
49 max: String,
50 },
51 Min {
52 value: String,
53 },
54 Max {
55 value: String,
56 },
57 Unit {
58 value: String,
59 },
60 BitBound {
61 value: String,
62 },
63 External {
64 value: Option<String>,
65 },
66 Nested {
67 value: Option<String>,
68 },
69 Verbatim {
70 language: Option<String>,
71 placement: Option<String>,
72 text: String,
73 },
74 Service {
75 platform: Option<String>,
76 },
77 Oneway {
78 value: Option<String>,
79 },
80 Ami {
81 value: Option<String>,
82 },
83 HashId {
84 value: Option<String>,
85 },
86 DefaultNested {
87 value: Option<String>,
88 },
89 IgnoreLiteralNames {
90 value: Option<String>,
91 },
92 TryConstruct {
93 value: Option<String>,
94 },
95 NonSerialized {
96 value: Option<String>,
97 },
98 DataRepresentation {
99 kinds: Vec<String>,
100 },
101 Topic {
102 name: Option<String>,
103 platform: Option<String>,
104 },
105 Choice,
106 Empty,
107 DdsService,
108 DdsRequestTopic {
109 name: String,
110 },
111 DdsReplyTopic {
112 name: String,
113 },
114 Builtin {
115 name: String,
116 params: Option<AnnotationParams>,
117 },
118 ScopedName {
119 name: ScopedName,
120 params: Option<AnnotationParams>,
121 },
122 DefaultLiteral,
123 Rename {
124 name: String,
125 },
126 RenameAll {
127 rule: RenameRule,
128 },
129 Skip,
130 Version,
132 Added {
135 version: ScopedName,
136 },
137 Removed {
140 version: ScopedName,
141 },
142}
143
144#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
145pub enum RenameRule {
146 None,
147 LowerCase,
148 UpperCase,
149 PascalCase,
150 CamelCase,
151 SnakeCase,
152 ScreamingSnakeCase,
153 KebabCase,
154 ScreamingKebabCase,
155}
156
157impl RenameRule {
158 pub fn as_str(&self) -> &'static str {
159 match self {
160 Self::None => "None",
161 Self::LowerCase => "lowercase",
162 Self::UpperCase => "UPPERCASE",
163 Self::PascalCase => "PascalCase",
164 Self::CamelCase => "camelCase",
165 Self::SnakeCase => "snake_case",
166 Self::ScreamingSnakeCase => "SCREAMING_SNAKE_CASE",
167 Self::KebabCase => "kebab-case",
168 Self::ScreamingKebabCase => "SCREAMING-KEBAB-CASE",
169 }
170 }
171}
172impl FromStr for RenameRule {
173 type Err = ();
174
175 fn from_str(s: &str) -> Result<Self, Self::Err> {
176 match s {
177 "lowercase" => Ok(Self::LowerCase),
178 "UPPERCASE" => Ok(Self::UpperCase),
179 "PascalCase" => Ok(Self::PascalCase),
180 "camelCase" => Ok(Self::CamelCase),
181 "snake_case" => Ok(Self::SnakeCase),
182 "SCREAMING_SNAKE_CASE" | "SCREAMINGSNAKECASE" => Ok(Self::ScreamingSnakeCase),
183 "kebab-case" => Ok(Self::KebabCase),
184 "SCREAMING-KEBAB-CASE" => Ok(Self::ScreamingKebabCase),
185 _ => Ok(Self::None),
186 }
187 }
188}
189
190#[derive(Debug, Serialize, Deserialize, Clone)]
191pub enum AnnotationParams {
192 ConstExpr(ConstExpr),
193 Positional(Vec<ConstExpr>),
194 Params(Vec<AnnotationParam>),
195 Raw(String),
196}
197
198#[derive(Debug, Serialize, Deserialize, Clone)]
199pub struct AnnotationParam {
200 pub ident: String,
201 pub value: Option<ConstExpr>,
202}