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