gob/internal/types/
mod.rs1use std::collections::BTreeMap;
2
3use serde_schema::types::Type;
4
5mod wire_type;
6pub(crate) use self::wire_type::WireType;
7
8mod common_type;
9pub(crate) use self::common_type::CommonType;
10
11mod array_type;
12pub(crate) use self::array_type::ArrayType;
13
14mod slice_type;
15pub(crate) use self::slice_type::SliceType;
16
17mod struct_type;
18pub(crate) use self::struct_type::{FieldType, StructType};
19
20mod map_type;
21pub(crate) use self::map_type::MapType;
22
23pub use schema::TypeId;
24
25#[derive(Debug)]
26pub struct Types {
27 map: BTreeMap<TypeId, WireType>,
28}
29
30pub(crate) fn lookup_builtin(id: TypeId) -> Option<&'static Type<TypeId>> {
31 match id {
32 TypeId::ARRAY_TYPE => Some(&self::array_type::ARRAY_TYPE_DEF),
33 TypeId::MAP_TYPE => Some(&self::map_type::MAP_TYPE_DEF),
34 TypeId::SLICE_TYPE => Some(&self::slice_type::SLICE_TYPE_DEF),
35 TypeId::FIELD_TYPE => Some(&self::struct_type::FIELD_TYPE_DEF),
36 TypeId::FIELD_TYPE_SLICE => Some(&self::struct_type::FIELD_TYPE_SLICE_DEF),
37 TypeId::STRUCT_TYPE => Some(&self::struct_type::STRUCT_TYPE_DEF),
38 TypeId::WIRE_TYPE => Some(&self::wire_type::WIRE_TYPE_DEF),
39 TypeId::COMMON_TYPE => Some(&self::common_type::COMMON_TYPE_DEF),
40 _ => None,
41 }
42}
43
44pub(crate) fn lookup_builtin2(id: TypeId) -> Option<&'static WireType> {
45 match id {
46 TypeId::ARRAY_TYPE => Some(&self::array_type::ARRAY_TYPE_DEF_2),
47 TypeId::MAP_TYPE => Some(&self::map_type::MAP_TYPE_DEF_2),
48 TypeId::SLICE_TYPE => Some(&self::slice_type::SLICE_TYPE_DEF_2),
49 TypeId::FIELD_TYPE => Some(&self::struct_type::FIELD_TYPE_DEF_2),
50 TypeId::FIELD_TYPE_SLICE => Some(&self::struct_type::FIELD_TYPE_SLICE_DEF_2),
51 TypeId::STRUCT_TYPE => Some(&self::struct_type::STRUCT_TYPE_DEF_2),
52 TypeId::WIRE_TYPE => Some(&self::wire_type::WIRE_TYPE_DEF_2),
53 TypeId::COMMON_TYPE => Some(&self::common_type::COMMON_TYPE_DEF_2),
54 _ => None,
55 }
56}
57
58impl Types {
59 pub fn new() -> Types {
60 Types {
61 map: BTreeMap::new(),
62 }
63 }
64
65 pub(crate) fn insert(&mut self, def: WireType) {
66 self.map.insert(def.common().id, def);
67 }
68
69 pub(crate) fn lookup(&self, id: TypeId) -> Option<&WireType> {
70 lookup_builtin2(id).or_else(|| self.map.get(&id))
71 }
72}