diff --git a/pulse-wire/src/general.rs b/pulse-wire/src/general.rs new file mode 100644 index 0000000..d7e88d9 --- /dev/null +++ b/pulse-wire/src/general.rs @@ -0,0 +1,97 @@ +use pulse_macros::pwp; + +use crate::PulseWire; + +#[pwp] +pub enum MarketTrend { + Bullish, + Bearish, + Neutral, +} + +#[pwp] +pub enum Volatility { + Low, + Medium, + High, +} + +#[pwp] +pub enum Direction { + Buy, + Sell, +} + +#[pwp] +pub struct Signal { + pub symbol: String, + pub kind: Direction, + pub confidence: f32, + pub size: f64, + pub price: f64, + pub take_profit: f64, + pub take_stop_loss: f64, +} + +#[pwp] +pub enum LogKind { + Info, + Warn, + Err, + Debug, +} + +#[pwp] +pub struct EventLog { + pub kind: LogKind, + pub name: String, + pub message: String, +} + +#[pwp] +pub struct Position { + pub symbol: String, + pub size: f64, + pub entry_price: f64, + pub profit: f64, +} + +impl std::fmt::Display for Direction { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Buy => write!(f, "BUY"), + Self::Sell => write!(f, "SELL"), + } + } +} + + +impl std::fmt::Display for MarketTrend { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Bullish => write!(f, "Bullish"), + Self::Bearish => write!(f, "Bearish"), + Self::Neutral => write!(f, "Neutral"), + } + } +} + +impl std::fmt::Display for Volatility { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Low => write!(f, "Low"), + Self::Medium => write!(f, "Medium"), + Self::High => write!(f, "High"), + } + } +} +impl std::fmt::Display for LogKind { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Info => write!(f, "INFO"), + Self::Warn => write!(f, "WARN"), + Self::Err => write!(f, "ERR"), + Self::Debug => write!(f, "DEBUG"), + } + } +} diff --git a/pulse-wire/src/lib.rs b/pulse-wire/src/lib.rs index 5a53401..168b737 100644 --- a/pulse-wire/src/lib.rs +++ b/pulse-wire/src/lib.rs @@ -2,6 +2,7 @@ use std::path::PathBuf; pub mod terminal; +pub mod general; pub fn server_path() -> PathBuf { PathBuf::from("/tmp/pulse-engine.sock") diff --git a/pulse-wire/src/terminal.rs b/pulse-wire/src/terminal.rs index 3e2af62..4a4f1ff 100644 --- a/pulse-wire/src/terminal.rs +++ b/pulse-wire/src/terminal.rs @@ -1,13 +1,16 @@ -use crate::PulseWire; +use crate::{ + PulseWire, + general::{EventLog, MarketTrend, Position, Signal, Volatility}, +}; use pulse_macros::pwp; #[pwp] pub enum TerminalServerMessage { // WatchList - WatchListUpdated(Vec), + WatchListUpdated(Vec), // Positions - PositionsUpdated(Vec), + PositionsUpdated(Vec), // Overview OverviewUpdated(MarketOverview), @@ -32,95 +35,19 @@ pub enum TerminalClientMessage { } #[pwp] -pub struct WatchListItem { - symbol: String, - price: f64, - trend: f64, - volume_24h: f64, -} - -#[pwp] -pub struct ActivePosition { +pub struct MarketItem { pub symbol: String, - pub size: f64, - pub entry_price: f64, - pub profit: f64, -} - -#[pwp] -pub enum MarketTrend { - Bullish, - Bearish, - Neutral, -} - -#[pwp] -pub enum Volatility { - Low, - Medium, - High, + pub price: f64, + pub trend: f64, + pub volume_24h: f64, } #[pwp] pub struct MarketOverview { - trend: MarketTrend, - volatility: Volatility, - pressure: f64, - - alerts: Vec, -} - -#[pwp] -pub enum Feed { - Connected, - Disconnected, - Connecting, - Failed, -} - -#[pwp] -pub struct Status { - feed: Feed, - exchange: String, - dex: String, - latency: u16, -} - -#[pwp] -pub enum SignalKind { - Buy, - Sell, -} - -#[pwp] -pub enum SignalParameter { - Lim, - Stl, - Tap, - Chk, -} - -#[pwp] -pub struct Signal { - kind: SignalKind, - symbol: String, - param: SignalParameter, - price: f64, -} - -#[pwp] -pub enum LogKind { - Info, - Warn, - Err, - Debug, -} - -#[pwp] -pub struct EventLog { - kind: LogKind, - name: String, - message: String, + pub trend: MarketTrend, + pub volatility: Volatility, + pub pressure: f64, + pub alerts: Vec, } #[pwp] @@ -129,13 +56,19 @@ pub enum AlertLevel { Medium, Low, } - #[pwp] pub struct Alert { level: AlertLevel, message: String, } +#[pwp] +pub struct Balance { + pub asset: String, + pub amount: f64, + pub value: f64, +} + #[pwp] pub enum InspectTarget { None, @@ -150,14 +83,20 @@ pub enum InspectItem { F64(f64), } -impl std::fmt::Display for MarketTrend { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Bullish => write!(f, "Bullish"), - Self::Bearish => write!(f, "Bearish"), - Self::Neutral => write!(f, "Neutral"), - } - } +#[pwp] +pub struct Status { + feed: Feed, + exchange: String, + dex: String, + latency: u16, +} + +#[pwp] +pub enum Feed { + Connected, + Disconnected, + Connecting, + Failed, } impl std::fmt::Display for AlertLevel { @@ -169,44 +108,3 @@ impl std::fmt::Display for AlertLevel { } } } - -impl std::fmt::Display for Volatility { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Low => write!(f, "Low"), - Self::Medium => write!(f, "Medium"), - Self::High => write!(f, "High"), - } - } -} - -impl std::fmt::Display for LogKind { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Info => write!(f, "INFO"), - Self::Warn => write!(f, "WARN"), - Self::Err => write!(f, "ERR"), - Self::Debug => write!(f, "DEBUG"), - } - } -} - -impl std::fmt::Display for SignalKind { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Buy => write!(f, "BUY"), - Self::Sell => write!(f, "SELL"), - } - } -} - -impl std::fmt::Display for SignalParameter { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Lim => write!(f, "LIM"), - Self::Stl => write!(f, "STL"), - Self::Tap => write!(f, "TAP"), - Self::Chk => write!(f, "CHK"), - } - } -} diff --git a/src/engine/engine.rs b/src/engine/engine.rs index d186484..04f9a8d 100644 --- a/src/engine/engine.rs +++ b/src/engine/engine.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use pulse_wire::terminal::ActivePosition; +use pulse_wire::general::Position; use tokio::{sync::Mutex, task::JoinHandle}; use crate::{ @@ -90,7 +90,7 @@ impl Engine { state .asset_positions .into_iter() - .map(|position| ActivePosition { + .map(|position| Position { symbol: position.position.coin, size: position.position.szi.as_f64(), entry_price: position diff --git a/src/engine/fetch.rs b/src/engine/fetch.rs index 9e91a79..8179732 100644 --- a/src/engine/fetch.rs +++ b/src/engine/fetch.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use pulse_wire::terminal::WatchListItem; +use pulse_wire::terminal::MarketItem; use serde_json::Value; fn number(value: &Value, field: &str) -> Result { @@ -15,7 +15,7 @@ fn number(value: &Value, field: &str) -> Result { pub async fn fetch_watch_list( client: &hypersdk::hypercore::HttpClient, symbols: &[String], -) -> Result, String> { +) -> Result, String> { let response = client .meta_and_asset_ctxs(None) .await @@ -63,7 +63,7 @@ pub async fn fetch_watch_list( by_symbol.insert( symbol, - WatchListItem { + MarketItem { symbol: symbol.to_owned(), price, trend: ((price / previous_day_price) - 1.0) * 100.0, diff --git a/src/engine/terminal.rs b/src/engine/terminal.rs index 4e3a503..72666c2 100644 --- a/src/engine/terminal.rs +++ b/src/engine/terminal.rs @@ -3,10 +3,7 @@ use std::{ sync::{Arc, Weak}, }; -use pulse_wire::{ - PulseWire, - terminal::{EventLog, LogKind, TerminalClientMessage}, -}; +use pulse_wire::{PulseWire, general::{EventLog, LogKind}, terminal::TerminalClientMessage}; use tokio::{ io::{AsyncReadExt, AsyncWriteExt}, net::{ diff --git a/src/terminal/formatting.rs b/src/terminal/formatting.rs index 223c31b..3495220 100644 --- a/src/terminal/formatting.rs +++ b/src/terminal/formatting.rs @@ -1,8 +1,9 @@ use pulse_wire::terminal::{ - ActivePosition, Alert, AlertLevel, EventLog, InspectItem, InspectTarget, LogKind, - MarketOverview, Signal, SignalKind, Status, WatchListItem, + Alert, AlertLevel, InspectItem, InspectTarget, MarketItem, MarketOverview, Status, }; +use pulse_wire::general::{Direction, EventLog, LogKind, Position, Signal}; + pub trait Formatted { fn get_formatted(&self) -> Vec; } @@ -64,19 +65,18 @@ impl Formatted for EventLog { impl Formatted for Signal { fn get_formatted(&self) -> Vec { vec![ - if matches!(self.kind, SignalKind::Buy) { + if matches!(self.kind, Direction::Buy) { format!("\x1b[32m{}\x1b[0m", self.kind) } else { format!("\x1b[31m{}\x1b[0m", self.kind) }, format!("\x1b[35m{}\x1b[0m", self.symbol), - format!("\x1b[34m{}\x1b[0m", self.param), format_f64(self.price), ] } } -impl Formatted for WatchListItem { +impl Formatted for MarketItem { fn get_formatted(&self) -> Vec { vec![ format!("\x1b[35m{}\x1b[0m", self.symbol), @@ -95,7 +95,7 @@ impl Formatted for WatchListItem { } } -impl Formatted for ActivePosition { +impl Formatted for Position { fn get_formatted(&self) -> Vec { vec![ format!("\x1b[35m{}\x1b[0m", self.symbol), diff --git a/src/terminal/main.rs b/src/terminal/main.rs index 61697e0..fa224d0 100644 --- a/src/terminal/main.rs +++ b/src/terminal/main.rs @@ -21,8 +21,9 @@ use pulse_ui::{ use crate::formatting::{Formatted, apply_padding}; -use pulse_wire::terminal::{ - ActivePosition, EventLog, InspectTarget, MarketOverview, Signal, Status, WatchListItem, +use pulse_wire::{ + general::{EventLog, Position, Signal}, + terminal::{InspectTarget, MarketItem, MarketOverview, Status}, }; pub struct PulseTradeApp { @@ -34,8 +35,8 @@ pub struct PulseTradeApp { market_overview: State>, status: State>, - watch_list: State>, - active_positions: State>, + watch_list: State>, + active_positions: State>, logs: State>, signals: State>, inspect: State, @@ -130,15 +131,19 @@ impl App for PulseTradeApp { ( LayoutItem::Widget(Size::Flex(1)), Box::new( - advanced_draw(&self.scroll, 1, "ACTIVE POSITIONS", &self.active_positions) - .await, + advanced_draw(&self.scroll, 1, "POSITIONS", &self.active_positions).await, ), ), ( LayoutItem::Widget(Size::Flex(1)), Box::new( - advanced_option_draw(&self.scroll, 2, "MARKET OVERVIEW", &self.market_overview) - .await, + advanced_option_draw( + &self.scroll, + 2, + "MARKET OVERVIEW", + &self.market_overview, + ) + .await, ), ), ]),