use crate::{utils::messaging::MaybeRequest, uuid_val, Str};
use anyhow::Result;
use derive::FromValue;
use netidx_derive::Pack;
use serde::{Deserialize, Serialize};
use std::{str::FromStr, sync::Arc};
use uuid::{uuid, Uuid};
static ACCOUNT_NS: Uuid = uuid!("c9c8b8e8-69f6-4ca2-83b7-76611e5d6d90");
uuid_val!(AccountId, ACCOUNT_NS);
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Pack, FromValue)]
#[cfg_attr(feature = "juniper", derive(juniper::GraphQLObject))]
pub struct Account {
pub id: AccountId,
pub name: Str,
}
impl Account {
pub fn new<S: AsRef<str>>(venue_name: S, exchange_account_id: S) -> Result<Self> {
let name = format!("{}:{}", venue_name.as_ref(), exchange_account_id.as_ref());
let id = AccountId::from_str(&name)?;
Ok(Self { id, name: Str::try_from(name.as_str())? })
}
}
#[derive(Debug, Clone, Pack, FromValue, Serialize, Deserialize)]
pub enum AccountMessage {
MapAccount(Account),
GetAccounts(Uuid),
Accounts(Uuid, Arc<Vec<Account>>),
}
impl MaybeRequest for AccountMessage {
fn request_id(&self) -> Option<Uuid> {
match self {
AccountMessage::GetAccounts(uuid) => Some(*uuid),
_ => None,
}
}
fn response_id(&self) -> Option<Uuid> {
match self {
AccountMessage::Accounts(uuid, _) => Some(*uuid),
_ => None,
}
}
}