openfare-lib 0.6.2

OpenFare core library.
Documentation
use anyhow::Result;
pub mod payment_methods;

pub const FILE_NAME: &'static str = "openfare-profile.json";

#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct RemoteProfile {
    #[serde(rename = "openfare-profile")]
    pub profile: Profile,
}

impl std::convert::From<Profile> for RemoteProfile {
    fn from(profile: Profile) -> Self {
        Self { profile: profile }
    }
}

#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct Profile {
    #[serde(rename = "unique-id")]
    pub unique_id: uuid::Uuid,
    #[serde(rename = "payment-methods")]
    payment_methods: std::collections::BTreeMap<payment_methods::Methods, serde_json::Value>,
}

impl Profile {
    pub fn check(&mut self) -> Result<()> {
        payment_methods::check(&self.payment_methods)?;
        Ok(())
    }

    pub fn payment_methods(&self) -> Result<Vec<Box<dyn payment_methods::PaymentMethod>>> {
        let mut methods = Vec::<Box<dyn payment_methods::PaymentMethod>>::new();
        for (method, json_value) in &self.payment_methods {
            let method = match method {
                payment_methods::Methods::PayPal => {
                    let method =
                        serde_json::from_value::<payment_methods::PayPal>(json_value.clone())?;
                    Box::new(method) as Box<dyn payment_methods::PaymentMethod>
                }
                payment_methods::Methods::BtcLightning => {
                    let method = serde_json::from_value::<payment_methods::BtcLightning>(
                        json_value.clone(),
                    )?;
                    Box::new(method) as Box<dyn payment_methods::PaymentMethod>
                }
            };
            methods.push(method);
        }
        Ok(methods)
    }

    pub fn set_payment_method(
        &mut self,
        payment_method: &Box<dyn payment_methods::PaymentMethod>,
    ) -> Result<()> {
        self.payment_methods.insert(
            payment_method.method(),
            payment_method.to_serde_json_value()?,
        );
        Ok(())
    }

    pub fn remove_payment_method(&mut self, method: &payment_methods::Methods) -> Result<()> {
        self.payment_methods.remove(method);
        Ok(())
    }
}

impl std::default::Default for Profile {
    fn default() -> Self {
        Self {
            unique_id: uuid::Uuid::new_v4(),
            payment_methods: std::collections::BTreeMap::<_, _>::new(),
        }
    }
}

impl std::convert::From<RemoteProfile> for Profile {
    fn from(remote_profile: RemoteProfile) -> Self {
        remote_profile.profile.clone()
    }
}