fetchlib 0.0.13

A lib for remote server connection through ssh
Documentation
use serde::Deserialize;
use serde::Deserializer;
use serde::Serialize;
use serde::Serializer;
use serde::ser::SerializeStruct;

#[derive(Debug, Clone)]
pub struct Credentials {
    pub username: String,
    pub password: Option<String>,
}

impl Serialize for Credentials {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let mut state = serializer.serialize_struct("Credentials", 2)?;
        state.serialize_field("username", &self.username)?;
        let pass;
        if let Some(content) = self.password.clone() {
            pass = content;
        } else {
            pass = String::from("");
        }
        state.serialize_field("password", &pass)?;
        state.end()
    }
}

impl<'de> Deserialize<'de> for Credentials {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        #[derive(Deserialize)]
        struct Helper {
            username: String,
            password: String,
        }
        let helper = Helper::deserialize(deserializer).unwrap();
        let password = if helper.password.is_empty() {
            None
        } else {
            Some(helper.password)
        };
        Ok(Credentials {
            username: helper.username,
            password,
        })
    }
}

impl Credentials {
    pub fn generate_opt_pass(content: String) -> Option<String> {
        if content.is_empty() {
            None
        } else {
            Some(content)
        }
    }

    pub fn from(username: String) -> Self {
        Self {
            username,
            password: None,
        }
    }

    pub fn from_with_pass(username: String, password: String) -> Self {
        Self {
            username,
            password: Self::generate_opt_pass(password),
        }
    }

    pub fn pass_as_str(&self) -> String {
        if self.password.is_some() {
            self.password.clone().unwrap()
        } else {
            String::from("")
        }
    }
}

impl Default for Credentials {
    fn default() -> Self {
        Self {
            username: String::new(),
            password: None,
        }
    }
}