use crate::{
symbology::{Venue, VenueId},
uuid_val, Str,
};
use anyhow::Result;
#[cfg(feature = "netidx")]
use derive::FromValue;
#[cfg(feature = "netidx")]
use netidx_derive::Pack;
use serde::{Deserialize, Serialize};
use std::str::FromStr;
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)]
#[cfg_attr(feature = "netidx", derive(Pack, FromValue))]
pub struct Account {
pub id: AccountId,
pub name: Str,
pub venue_id: VenueId,
}
impl Account {
pub fn new(venue: &Venue, exchange_account_id: impl AsRef<str>) -> Result<Self> {
let name = format!("{}:{}", venue.name, exchange_account_id.as_ref());
let id = AccountId::from_str(&name)?;
Ok(Self { id, name: Str::try_from(name.as_str())?, venue_id: venue.id })
}
}
#[derive(Debug, Default, Clone, Copy, Serialize, Deserialize)]
#[cfg_attr(feature = "netidx", derive(Pack, FromValue))]
pub struct AccountPermissions {
pub list: Option<bool>, pub view: Option<bool>, pub trade: Option<bool>, pub reduce_or_close: Option<bool>, pub set_limits: Option<bool>, }
impl AccountPermissions {
pub fn all() -> Self {
Self {
list: Some(true),
view: Some(true),
trade: Some(true),
reduce_or_close: Some(true),
set_limits: Some(true),
}
}
pub fn none() -> Self {
Self {
list: Some(false),
view: Some(false),
trade: Some(false),
reduce_or_close: Some(false),
set_limits: Some(false),
}
}
pub fn with_default(&self, default: &Self) -> Self {
Self {
list: self.list.or(default.list),
view: self.view.or(default.view),
trade: self.trade.or(default.trade),
reduce_or_close: self.reduce_or_close.or(default.reduce_or_close),
set_limits: self.set_limits.or(default.set_limits),
}
}
pub fn list(&self) -> bool {
self.list.unwrap_or(false)
}
pub fn view(&self) -> bool {
self.view.unwrap_or(false)
}
pub fn trade(&self) -> bool {
self.trade.unwrap_or(false)
}
pub fn reduce_or_close(&self) -> bool {
self.reduce_or_close.unwrap_or(false)
}
pub fn set_limits(&self) -> bool {
self.set_limits.unwrap_or(false)
}
pub fn display(&self) -> String {
let mut allowed = vec![];
let mut denied = vec![];
macro_rules! sift {
($perm:ident) => {
if self.$perm == Some(true) {
allowed.push(stringify!($perm));
} else if self.$perm == Some(false) {
denied.push(stringify!($perm));
}
};
}
sift!(list);
sift!(view);
sift!(trade);
sift!(reduce_or_close);
sift!(set_limits);
format!("allow({}) deny({})", allowed.join(", "), denied.join(", "))
}
}