protokit_proto/translate/
fields.rs

1use protokit_desc::{DataType, EnumFields, FieldDef, MessageFields, UnresolvedHint, VariantDef};
2
3use crate::ast::*;
4// use crate::translate::opts::opts;
5use 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        // todo!()
15    }
16    fn visit_oneof(&mut self, _item: &mut OneOf) {
17        // todo!()
18    }
19    fn visit_enum(&mut self, _item: &mut Enum) {
20        // todo!()
21    }
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            // options: Default::default(),
49            ..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.syms.intern(item.name);
89        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}