concat_paths(a: &str, b: &str) -> String1 pub(crate) fn concat_paths(a: &str, b: &str) -> String {
2     if a.is_empty() {
3         b.to_owned()
4     } else if b.is_empty() {
5         b.to_owned()
6     } else {
7         format!("{}.{}", a, b)
8     }
9 }
10 
protobuf_name_starts_with_package<'a>( name: &'a str, package: &str, ) -> Option<&'a str>11 pub(crate) fn protobuf_name_starts_with_package<'a>(
12     name: &'a str,
13     package: &str,
14 ) -> Option<&'a str> {
15     assert!(
16         !package.starts_with("."),
17         "package must not start with dot: {}",
18         package
19     );
20 
21     assert!(
22         name.starts_with("."),
23         "full name must start with dot: {}",
24         name
25     );
26     let name = &name[1..];
27     // assert!(!name.starts_with("."), "full name must not start with dot: {}", name);
28 
29     if package.is_empty() {
30         Some(name)
31     } else {
32         if name.starts_with(package) {
33             let rem = &name[package.len()..];
34             if rem.starts_with(".") {
35                 Some(&rem[1..])
36             } else {
37                 None
38             }
39         } else {
40             None
41         }
42     }
43 }
44 
45 #[test]
test_protobuf_name_starts_with_package()46 fn test_protobuf_name_starts_with_package() {
47     assert_eq!(
48         Some("bar"),
49         protobuf_name_starts_with_package(".foo.bar", "foo")
50     );
51     assert_eq!(None, protobuf_name_starts_with_package(".foo", "foo"));
52     assert_eq!(Some("foo"), protobuf_name_starts_with_package(".foo", ""));
53 }
54