openfare_lib/profile/
mod.rs1use 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}