fuchsia_triage/metrics/
variable.rs

1// Copyright 2019 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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}