1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
static NAMES: &'static [&'static str] = &[
"Any",
"Api",
"BoolValue",
"BytesValue",
"DoubleValue",
"Duration",
"Empty",
"Enum",
"EnumValue",
"Field",
"Field.Cardinality",
"Field.Kind",
"FieldMask",
"FloatValue",
"Int32Value",
"Int64Value",
"ListValue",
"Method",
"Mixin",
"NullValue",
"Option",
"SourceContext",
"StringValue",
"Struct",
"Syntax",
"Timestamp",
"Type",
"UInt32Value",
"UInt64Value",
"Value",
];
fn is_well_known_type(name: &str) -> bool {
NAMES.iter().any(|&n| n == name)
}
pub fn is_well_known_type_full(name: &str) -> Option<&str> {
if let Some(dot) = name.rfind('.') {
if &name[..dot] == ".google.protobuf" && is_well_known_type(&name[dot + 1..]) {
Some(&name[dot + 1..])
} else {
None
}
} else {
None
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_is_well_known_type_full() {
assert_eq!(
Some("BoolValue"),
is_well_known_type_full(".google.protobuf.BoolValue")
);
assert_eq!(None, is_well_known_type_full(".google.protobuf.Fgfg"));
}
}