use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Source {
Plan,
Auto,
Headless,
Override,
Manual,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Outcome {
Win,
Loss,
Scratch,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum EventKind {
DecisionMade { symbol: String, source: Source },
TradeClosed {
symbol: String,
outcome: Outcome,
pnl_r: f64,
conviction: Option<u8>,
},
BreakStarted { planned_ms: Option<u64> },
BreakEnded,
Idle { since_ms: u64 },
Resumed,
VerdictShown,
VerdictOverridden,
SessionStarted,
SessionEnded,
Conviction { trade_id: String, rating: u8 },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Event {
pub ts: DateTime<Utc>,
#[serde(flatten)]
pub kind: EventKind,
}
impl Event {
#[must_use]
pub fn new(ts: DateTime<Utc>, kind: EventKind) -> Self {
Self { ts, kind }
}
}