diff options
Diffstat (limited to '2.27.1/src/well_known_types.rs')
-rw-r--r-- | 2.27.1/src/well_known_types.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/2.27.1/src/well_known_types.rs b/2.27.1/src/well_known_types.rs new file mode 100644 index 0000000..6264947 --- /dev/null +++ b/2.27.1/src/well_known_types.rs @@ -0,0 +1,63 @@ +static NAMES: &'static [&'static str] = &[ + "Any", + "Api", + "BoolValue", + "BytesValue", + "DoubleValue", + "Duration", + "Empty", + "Enum", + "EnumValue", + "Field", + // TODO: dotted names + "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")); + } +} |