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()
}
}