gob/internal/types/
mod.rs

1use 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}