sandbox-quant 1.0.10

Exchange-truth trading core for Binance Spot and Futures
Documentation
use std::fs::{create_dir_all, OpenOptions};
use std::io::Write;
use std::path::PathBuf;

use chrono::Utc;

use crate::storage::models::EventRecord;

#[derive(Debug, Default, Clone, PartialEq)]
pub struct EventLog {
    pub records: Vec<EventRecord>,
}

impl EventLog {
    pub fn append(&mut self, record: EventRecord) {
        append_record_to_jsonl(&record);
        self.records.push(record);
    }
}

pub fn log(event_log: &mut EventLog, kind: impl Into<String>, payload: serde_json::Value) {
    event_log.append(EventRecord {
        kind: kind.into(),
        payload,
    });
}

fn append_record_to_jsonl(record: &EventRecord) {
    let path = std::env::var("SANDBOX_QUANT_EVENT_LOG_PATH")
        .map(PathBuf::from)
        .unwrap_or_else(|_| PathBuf::from("var/operator-events.jsonl"));
    if let Some(parent) = path.parent() {
        if create_dir_all(parent).is_err() {
            return;
        }
    }
    let mut file = match OpenOptions::new().create(true).append(true).open(&path) {
        Ok(file) => file,
        Err(_) => return,
    };
    let line = serde_json::json!({
        "ts": Utc::now().to_rfc3339(),
        "kind": record.kind,
        "payload": record.payload,
    });
    let _ = writeln!(file, "{}", line);
}