openfare_lib/profile/
mod.rs

1use anyhow::Result;
2pub mod payment_methods;
3
4pub const FILE_NAME: &'static str = "openfare-profile.json";
5
6#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
7pub struct RemoteProfile {
8    #[serde(rename = "openfare-profile")]
9    pub profile: Profile,
10}
11
12impl std::convert::From<Profile> for RemoteProfile {
13    fn from(profile: Profile) -> Self {
14        Self { profile: profile }
15    }
16}
17
18#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
19pub struct Profile {
20    #[serde(rename = "unique-id")]
21    pub unique_id: uuid::Uuid,
22    #[serde(rename = "payment-methods")]
23    payment_methods: std::collections::BTreeMap<payment_methods::Methods, serde_json::Value>,
24}
25
26impl Profile {
27    pub fn check(&mut self) -> Result<()> {
28        payment_methods::check(&self.payment_methods)?;
29        Ok(())
30    }
31
32    pub fn payment_methods(&self) -> Result<Vec<Box<dyn payment_methods::PaymentMethod>>> {
33        let mut methods = Vec::<Box<dyn payment_methods::PaymentMethod>>::new();
34        for (method, json_value) in &self.payment_methods {
35            let method = match method {
36                payment_methods::Methods::PayPal => {
37                    let method =
38                        serde_json::from_value::<payment_methods::PayPal>(json_value.clone())?;
39                    Box::new(method) as Box<dyn payment_methods::PaymentMethod>
40                }
41                payment_methods::Methods::BtcLightning => {
42                    let method = serde_json::from_value::<payment_methods::BtcLightning>(
43                        json_value.clone(),
44                    )?;
45                    Box::new(method) as Box<dyn payment_methods::PaymentMethod>
46                }
47            };
48            methods.push(method);
49        }
50        Ok(methods)
51    }
52
53    pub fn set_payment_method(
54        &mut self,
55        payment_method: &Box<dyn payment_methods::PaymentMethod>,
56    ) -> Result<()> {
57        self.payment_methods.insert(
58            payment_method.method(),
59            payment_method.to_serde_json_value()?,
60        );
61        Ok(())
62    }
63
64    pub fn remove_payment_method(&mut self, method: &payment_methods::Methods) -> Result<()> {
65        self.payment_methods.remove(method);
66        Ok(())
67    }
68}
69
70impl std::default::Default for Profile {
71    fn default() -> Self {
72        Self {
73            unique_id: uuid::Uuid::new_v4(),
74            payment_methods: std::collections::BTreeMap::<_, _>::new(),
75        }
76    }
77}
78
79impl std::convert::From<RemoteProfile> for Profile {
80    fn from(remote_profile: RemoteProfile) -> Self {
81        remote_profile.profile.clone()
82    }
83}