waves_rust/model/rs/
alias.rs

1use crate::error::{Error, Result};
2use crate::model::Alias;
3use crate::util::JsonDeserializer;
4use serde_json::Value;
5
6#[derive(Clone, Eq, PartialEq, Debug)]
7pub struct AliasesByAddressResponse {
8    aliases: Vec<Alias>,
9}
10
11impl AliasesByAddressResponse {
12    pub fn new(aliases: Vec<Alias>) -> Self {
13        Self { aliases }
14    }
15
16    pub fn aliases(&self) -> Vec<Alias> {
17        self.aliases.clone()
18    }
19}
20
21impl TryFrom<&Value> for AliasesByAddressResponse {
22    type Error = Error;
23
24    fn try_from(value: &Value) -> Result<Self> {
25        let vec: Vec<String> = JsonDeserializer::safe_to_array(value)?
26            .iter()
27            .filter_map(|alias| alias.as_str())
28            .map(|alias| alias.to_owned())
29            .collect();
30
31        return if vec.is_empty() {
32            Ok(AliasesByAddressResponse { aliases: vec![] })
33        } else {
34            let chain_id = Alias::chain_id(vec[0].as_str().to_owned());
35            let aliases = vec
36                .iter()
37                .map(|alias| Alias::new(chain_id, alias))
38                .collect::<Result<Vec<Alias>>>()?;
39            Ok(AliasesByAddressResponse { aliases })
40        };
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use crate::model::AliasesByAddressResponse;
47    use serde_json::Value;
48    use std::borrow::Borrow;
49    use std::fs;
50
51    #[test]
52    pub fn aliases_by_address_response() {
53        let data = fs::read_to_string("./tests/resources/alias/aliases_by_address_rs.json")
54            .expect("Unable to read file");
55        let json: Value = serde_json::from_str(&data).expect("failed to generate json from str");
56
57        let aliases_by_address: AliasesByAddressResponse = json.borrow().try_into().unwrap();
58
59        let aliases = aliases_by_address.aliases();
60        assert_eq!(aliases.len(), 3);
61
62        let alias1 = &aliases[0];
63        assert_eq!("alias:T:alias1662650000377", alias1.full_name());
64        assert_eq!("alias1662650000377", alias1.name());
65        let alias2 = &aliases[1];
66        assert_eq!("alias:T:alias2662650000377", alias2.full_name());
67        assert_eq!("alias2662650000377", alias2.name());
68        let alias3 = &aliases[2];
69        assert_eq!("alias:T:alias3662650000377", alias3.full_name());
70        assert_eq!("alias3662650000377", alias3.name());
71    }
72}