brasilapi_client/definitions/
ddd.rs

1use crate::{client::*, constants::ddd::*, errors::*, request::*};
2use serde::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize, Debug)]
5#[serde(rename_all = "camelCase")]
6/// The DDD message struct
7pub struct DDDResponseData {
8    /// The country state (i.e: SP)
9    pub state: String,
10    /// The cities using this DDD
11    pub cities: Vec<String>
12}
13
14impl PartialEq for DDDResponseData {
15    fn eq(&self, other: &Self) -> bool {
16        self.state == other.state && self.cities == other.cities
17    }
18}
19
20impl BrasilApiClient{
21    pub async fn get_city_and_states_by_ddd(&self, ddd: &i8) -> Result<DDDResponseData, Error> {
22
23        if ddd < MIN_DDD || ddd > MAX_DDD {
24            return Err(Error::InvalidInputRangeError
25                {
26                    name: "ddd".to_string(),
27                    min: *MIN_DDD as i32, 
28                    max: *MAX_DDD as i32
29                })
30        }
31
32        Ok(get::<(), DDDResponseData>(
33            &format!("{}/{}/{}", self.base_url, SVC_URL, ddd)
34        ).await?)
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41    use crate::client::tests::cli;
42    use futures_await_test::async_test;
43
44    #[async_test]
45    async fn test_invalid_min_range() {
46        let code = MIN_DDD - 1;
47        let resp = cli().get_city_and_states_by_ddd(&code).await;
48        assert!(resp.is_err());
49    }
50
51    #[async_test]
52    async fn test_invalid_max_range() {
53        let code = MAX_DDD + 1;
54        let resp = cli().get_city_and_states_by_ddd(&code).await;
55        assert!(resp.is_err());
56    }
57
58
59    #[async_test]
60    async fn test_valid_ddd_97() {
61        let resp = cli().get_city_and_states_by_ddd(&97).await;
62        assert!(resp.is_ok());
63
64        let expected_text = r#"{"state":"AM","cities":["UARINI","TONANTINS","TEFÉ","TAPAUÁ","TABATINGA","SÃO PAULO DE OLIVENÇA","SÃO GABRIEL DA CACHOEIRA","SANTO ANTÔNIO DO IÇÁ","SANTA ISABEL DO RIO NEGRO","PAUINI","NOVO ARIPUANÃ","MARAÃ","MANICORÉ","LÁBREA","JUTAÍ","JURUÁ","JAPURÁ","ITAMARATI","IPIXUNA","HUMAITÁ","GUAJARÁ","FONTE BOA","ENVIRA","EIRUNEPÉ","CODAJÁS","COARI","CARAUARI","CANUTAMA","BOCA DO ACRE","BERURI","BENJAMIN CONSTANT","BARCELOS","ATALAIA DO NORTE","APUÍ","ANORI","ANAMÃ","AMATURÁ","ALVARÃES"]}"#;
65        let expected_json = serde_json::from_str::<DDDResponseData>(expected_text).unwrap();
66
67        let from_svc = resp.unwrap();
68
69        assert_eq!(from_svc, expected_json);
70    }
71
72    #[async_test]
73    async fn test_non_existing() {
74        let resp = cli().get_city_and_states_by_ddd(&26).await;
75        assert!(resp.is_err());
76    }
77
78}