use std::fmt::Debug;

#[derive(Serialize, Deserialize, Debug, Default)]
pub struct TelegramResult<T: Debug> {
    ok: bool,

    #[serde(skip_serializing_if = "Option::is_none", default)]
    pub description: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none", default)]
    result: Option<T>,
}

impl<T> TelegramResult<T>
where
    T: Debug,
{
    pub fn ok(&self) -> bool {
        if self.ok && self.result.is_none() {
            error!("TelegramResult is ok but the content is missing!");
            error!("{:#?}", self);
        }

        self.ok && self.result.is_some()
    }

    pub fn has_description(&self) -> bool {
        self.description.is_some()
    }

    pub fn unwrap(self) -> T {
        self.result.unwrap()
    }

    pub fn get_ref(&self) -> &T {
        self.result.as_ref().unwrap()
    }
}
