fuchsia_triage/metrics/
variable.rs
1use serde::{Deserialize, Serialize};
6
7#[derive(Deserialize, Debug, Clone, PartialEq, Serialize)]
8pub struct VariableName {
9 pub name: String,
10}
11
12impl<'a> VariableName {
13 pub fn new(name: String) -> VariableName {
14 VariableName { name }
15 }
16
17 pub fn original_name(&'a self) -> &'a str {
18 &self.name
19 }
20
21 pub fn includes_namespace(&self) -> bool {
22 self.name.contains(':')
23 }
24
25 pub fn name_parts(&'a self, namespace: &'a str) -> Option<(&'a str, &'a str)> {
26 let name_parts = self.name.split("::").collect::<Vec<_>>();
27 match name_parts.len() {
28 1 => Some((namespace, &self.name)),
29 2 => {
30 let namespace_length = name_parts[0].len();
31 let name_start = namespace_length + 2;
32 let name_end = name_start + name_parts[1].len();
33 Some((&self.name[..namespace_length], &self.name[name_start..name_end]))
34 }
35 _ => None,
36 }
37 }
38
39 pub fn full_name(&self, namespace: &str) -> String {
40 let mut name_parts = self.name.split("::");
41 let _ = name_parts.next();
42 if name_parts.next().is_none() {
43 namespace.to_owned() + &self.name
44 } else {
45 self.name.clone()
46 }
47 }
48}
49
50#[cfg(test)]
51mod test {
52 use super::*;
53
54 #[fuchsia::test]
55 fn name_with_namespace() {
56 let name = VariableName::new("a::b".to_string());
57 assert_eq!(name.original_name(), "a::b".to_string());
58 assert!(name.includes_namespace());
59 assert_eq!(name.name_parts("c"), Some(("a", "b")));
60 }
61
62 #[fuchsia::test]
63 fn name_without_namespace() {
64 let name = VariableName::new("b".to_string());
65 assert_eq!(name.original_name(), "b".to_string());
66 assert!(!name.includes_namespace());
67 assert_eq!(name.name_parts("c"), Some(("c", "b")));
68 }
69
70 #[fuchsia::test]
71 fn too_many_namespaces() {
72 let name = VariableName::new("a::b::c".to_string());
73 assert_eq!(name.original_name(), "a::b::c".to_string());
74 assert!(name.includes_namespace());
75 assert_eq!(name.name_parts("d"), None);
76 }
77}