rinance_dtos 2.1.6

Rinance Dtos
Documentation
use anyhow::bail;
use serde::{Deserialize, Serialize};
use tokio_postgres::Row;

use crate::Error;

#[derive(Deserialize, Serialize, Debug)]
pub struct Exchange {
    pub exchange_id: ExchangeId,
    pub name: String,
}

impl TryFrom<&Row> for Exchange {
    type Error = Error;

    fn try_from(value: &Row) -> Result<Self, Self::Error> {
        let id: i64 = value.try_get("id")?;
        let name: String = value.try_get("name")?;

        Ok(Exchange {
            exchange_id: id.try_into()?,
            name: name,
        })
    }
}

#[derive(Serialize, Deserialize, Debug)]
pub enum ExchangeId {
    US = 1,
}

impl TryFrom<&str> for ExchangeId {
    type Error = anyhow::Error;

    fn try_from(value: &str) -> Result<Self, Self::Error> {
        let v = match value {
            "US" => ExchangeId::US,
            _ => bail!("couldn't match value {value} to exchange id"),
        };
        Ok(v)
    }
}

impl TryFrom<i64> for ExchangeId {
    type Error = anyhow::Error;

    fn try_from(value: i64) -> Result<Self, Self::Error> {
        let v = match value {
            1 => ExchangeId::US,
            _ => bail!("couldn't map {value} to exchange id"),
        };
        Ok(v)
    }
}

impl From<&ExchangeId> for &str {
    fn from(value: &ExchangeId) -> Self {
        match value {
            ExchangeId::US => "US",
        }
    }
}

impl From<&ExchangeId> for i64 {
    fn from(value: &ExchangeId) -> Self {
        match value {
            ExchangeId::US => 1,
        }
    }
}

impl ToString for ExchangeId {
    fn to_string(&self) -> String {
        let s: &str = self.into();
        s.to_string()
    }
}