core/rustybot/src/currency.rs

135 lines
2.8 KiB
Rust
Raw Normal View History

2021-01-03 15:54:36 +00:00
use core::fmt;
use std::fmt::{Display, Formatter};
2021-01-04 10:45:54 +00:00
pub const XMR: Symbol = Symbol { name: "XMR" };
pub const BTC: Symbol = Symbol { name: "BTC" };
pub const ETH: Symbol = Symbol { name: "ETH" };
pub const LTC: Symbol = Symbol { name: "LTC" };
pub const USD: Symbol = Symbol { name: "USD" };
pub const GBP: Symbol = Symbol { name: "GBP" };
pub const EUR: Symbol = Symbol { name: "EUR" };
2021-01-03 15:54:36 +00:00
2021-01-02 19:01:39 +00:00
#[derive(Clone)]
2021-01-04 10:45:54 +00:00
pub struct Symbol<'a> {
name: &'a str
2021-01-03 15:54:36 +00:00
}
2021-01-02 19:01:39 +00:00
2021-01-04 10:45:54 +00:00
impl<S> From<S> for Symbol where S:Into<String> {
fn from(item: S) -> Self {
Symbol { name: &item.into() }
}
}
2021-01-02 19:01:39 +00:00
impl Symbol {
2021-01-04 10:45:54 +00:00
pub fn new(name: &str) -> Self {
Symbol { name }
}
2021-01-03 15:54:36 +00:00
pub fn name(&self) -> &str {
&self.name
}
2021-01-02 19:01:39 +00:00
}
2021-01-03 15:54:36 +00:00
impl Display for Symbol {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.name)
}
2021-01-02 19:01:39 +00:00
}
#[derive(Clone)]
2021-01-04 10:45:54 +00:00
pub struct SymbolPair<'a> {
quote: Symbol<'a>,
base: Symbol<'a>,
2021-01-02 19:01:39 +00:00
}
2021-01-03 15:54:36 +00:00
impl SymbolPair {
2021-01-04 10:45:54 +00:00
pub fn new(quote: Symbol, base: Symbol) -> Self {
SymbolPair { quote, base }
}
pub fn trading_repr(&self) -> String {
2021-01-03 15:54:36 +00:00
format!("t{}{}", self.quote, self.base)
2021-01-02 19:01:39 +00:00
}
2021-01-04 10:45:54 +00:00
pub fn funding_repr(&self) -> String {
2021-01-03 15:54:36 +00:00
format!("f{}{}", self.quote, self.base)
2021-01-02 19:01:39 +00:00
}
2021-01-03 15:54:36 +00:00
pub fn quote(&self) -> &Symbol {
&self.quote
2021-01-02 19:01:39 +00:00
}
2021-01-03 15:54:36 +00:00
pub fn base(&self) -> &Symbol {
&self.base
2021-01-02 19:01:39 +00:00
}
}
#[derive(Clone)]
enum WalletKind {
Margin,
Exchange,
Funding,
}
#[derive(Clone)]
2021-01-04 10:45:54 +00:00
struct Balance<'a> {
pair: SymbolPair<'a>,
2021-01-03 15:54:36 +00:00
base_price: f64,
base_amount: f64,
2021-01-02 19:01:39 +00:00
quote_equivalent: f64,
wallet: WalletKind,
}
impl Balance {
2021-01-03 15:54:36 +00:00
pub fn new(pair: SymbolPair, base_price: f64, base_amount: f64, wallet: WalletKind) -> Self {
Balance { pair, base_price, base_amount, quote_equivalent: base_amount * base_price, wallet }
2021-01-02 19:01:39 +00:00
}
2021-01-03 15:54:36 +00:00
pub fn pair(&self) -> &SymbolPair {
&self.pair
2021-01-02 19:01:39 +00:00
}
2021-01-03 15:54:36 +00:00
pub fn base_price(&self) -> f64 {
self.base_price
}
pub fn base_amount(&self) -> f64 {
self.base_amount
2021-01-02 19:01:39 +00:00
}
pub fn quote_equivalent(&self) -> f64 {
self.quote_equivalent
}
pub fn wallet(&self) -> &WalletKind {
&self.wallet
}
}
2021-01-04 10:45:54 +00:00
struct BalanceGroup<'a> {
2021-01-02 19:01:39 +00:00
quote_equivalent: f64,
2021-01-04 10:45:54 +00:00
balances: Vec<Balance<'a>>,
2021-01-02 19:01:39 +00:00
}
impl BalanceGroup {
2021-01-03 15:54:36 +00:00
pub fn new() -> Self {
BalanceGroup { balances: Vec::new(), quote_equivalent: 0f64 }
2021-01-02 19:01:39 +00:00
}
pub fn add_balance(&mut self, balance: &Balance) {
self.balances.push(balance.clone());
self.quote_equivalent += balance.quote_equivalent()
}
pub fn currency_names(&self) -> Vec<String> {
self.balances.iter()
2021-01-03 15:54:36 +00:00
.map(|x| x.pair().base().name().into())
2021-01-02 19:01:39 +00:00
.collect()
}
pub fn balances(&self) -> &Vec<Balance> {
&self.balances
}
}