protokit_proto/translate/
fields.rs1use protokit_desc::{DataType, EnumFields, FieldDef, MessageFields, UnresolvedHint, VariantDef};
2
3use crate::ast::*;
4use crate::translate::TranslateCtx;
6
7struct FieldVisitor<'tcx> {
8 pub ctx: &'tcx mut TranslateCtx,
9 pub fields: &'tcx mut MessageFields,
10}
11
12impl Visitor for FieldVisitor<'_> {
13 fn visit_message(&mut self, _item: &mut Message) {
14 }
16 fn visit_oneof(&mut self, _item: &mut OneOf) {
17 }
19 fn visit_enum(&mut self, _item: &mut Enum) {
20 }
22 fn visit_map_field(&mut self, item: &mut MapField) {
23 let val_type = match &item.val_type {
24 Type::Builtin(b) => DataType::Builtin(*b),
25 Type::Named(u) => DataType::Unresolved(self.ctx.def.cache(u), UnresolvedHint::Message),
26 Type::Map(_, _) => {
27 self.ctx.error("Nested maps are not supported".to_string()).unwrap();
28 DataType::Builtin(BuiltinType::Bool)
29 }
30 };
31 self.fields.insert(FieldDef {
32 name: self.ctx.def.cache(*item.name),
33 frequency: Frequency::Singular,
34 typ: DataType::Map(Box::new((item.key_type, val_type))),
35 num: item.number,
36 #[cfg(feature = "descriptors")]
37 options: opts(self.ctx, item),
38 ..Default::default()
39 })
40 }
41 fn visit_group(&mut self, item: &mut Group) {
42 let name = self.ctx.def.cache(*item.name);
43 self.fields.insert(FieldDef {
44 name: name.clone(),
45 frequency: Default::default(),
46 typ: DataType::Unresolved(name, UnresolvedHint::Group),
47 num: item.number,
48 ..Default::default()
50 })
51 }
52 fn visit_field(&mut self, item: &mut Field) {
53 let dtyp = match &item.typ {
54 Type::Builtin(b) => DataType::Builtin(*b),
55 Type::Named(e) => DataType::Unresolved(self.ctx.def.cache(e), UnresolvedHint::Message),
56 Type::Map(k, v) => DataType::Map(Box::new((
57 *k,
58 DataType::Unresolved(self.ctx.def.cache(v), UnresolvedHint::Message),
59 ))),
60 };
61 let def = FieldDef {
62 name: self.ctx.def.cache(*item.name),
63 frequency: item.frequency,
64 typ: dtyp,
65 num: item.number,
66 #[cfg(feature = "descriptors")]
67 options: opts(self.ctx, item),
68 ..Default::default()
69 };
70
71 self.fields.insert(def);
72 }
73}
74
75pub fn fields(ctx: &mut TranslateCtx, m: &mut impl AstNode) -> MessageFields {
76 let mut f = MessageFields::default();
77 m.accept(&mut FieldVisitor { ctx, fields: &mut f });
78 f
79}
80
81pub struct EnumFieldVisitor<'tcx> {
82 pub ctx: &'tcx mut TranslateCtx,
83 pub variants: &'tcx mut EnumFields,
84}
85
86impl Visitor for EnumFieldVisitor<'_> {
87 fn visit_enum_field(&mut self, item: &mut EnumField) {
88 let name = self.ctx.def.cache(*item.name);
90 let def = VariantDef {
91 name: name.clone(),
92 num: item.value,
93 #[cfg(feature = "descriptors")]
94 options: opts(self.ctx, item),
95 ..Default::default()
96 };
97 self.variants.by_name.insert(name, def);
98 }
99}
100
101pub fn enum_fields(ctx: &mut TranslateCtx, n: &mut impl AstNode) -> EnumFields {
102 let mut variants = EnumFields::default();
103 n.accept(&mut EnumFieldVisitor {
104 ctx,
105 variants: &mut variants,
106 });
107 variants
108}