bt_hfp/call/
number.rs

1// Copyright 2021 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
5/// The fuchsia.bluetooth.hfp library representation of a Number.
6pub type FidlNumber = String;
7
8/// A phone number.
9#[derive(Debug, Clone, PartialEq, Hash, Default, Eq)]
10pub struct Number(String);
11
12impl Number {
13    /// Format value indicating no changes on the number presentation are required.
14    /// See HFP v1.8, Section 4.34.2.
15    const NUMBER_FORMAT: i64 = 129;
16
17    /// Returns the numeric representation of the Number's format as specified in HFP v1.8,
18    /// Section 4.34.2.
19    pub fn type_(&self) -> i64 {
20        Number::NUMBER_FORMAT
21    }
22}
23
24impl From<Number> for String {
25    fn from(x: Number) -> Self {
26        x.0
27    }
28}
29
30impl From<&str> for Number {
31    fn from(n: &str) -> Self {
32        // Phone numbers must be enclosed in double quotes
33        let inner = if n.starts_with("\"") && n.ends_with("\"") {
34            n.to_string()
35        } else {
36            format!("\"{}\"", n)
37        };
38        Self(inner)
39    }
40}
41
42impl From<FidlNumber> for Number {
43    fn from(n: FidlNumber) -> Self {
44        n.as_str().into()
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[fuchsia::test]
53    fn number_type_in_valid_range() {
54        let number = Number::from("1234567");
55        // type values must be in range 128-175.
56        assert!(number.type_() >= 128);
57        assert!(number.type_() <= 175);
58    }
59
60    #[fuchsia::test]
61    fn number_str_roundtrip() {
62        let number = Number::from("1234567");
63        assert_eq!(number.clone(), Number::from(&*String::from(number)));
64    }
65}