This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
use anyhow::{Context, Result};
|
||||
use chrono::Utc;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fs::{self, OpenOptions};
|
||||
use std::io::Write;
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
||||
pub struct LoggerPayload {
|
||||
pub message: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
||||
pub struct LoggerRecord {
|
||||
pub timestamp: String,
|
||||
pub action_id: String,
|
||||
pub message: String,
|
||||
}
|
||||
|
||||
pub fn run_logger(payload: LoggerPayload) -> Result<()> {
|
||||
let record = build_logger_record(payload)?;
|
||||
fs::create_dir_all("logs").context("creating logs directory")?;
|
||||
|
||||
let mut file = OpenOptions::new()
|
||||
.create(true)
|
||||
.append(true)
|
||||
.open("logs/controller-actions.jsonl")
|
||||
.context("opening logs/controller-actions.jsonl")?;
|
||||
|
||||
serde_json::to_writer(&mut file, &record)?;
|
||||
file.write_all(b"\n")?;
|
||||
println!("logger wrote: {}", record.message);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn build_logger_record(payload: LoggerPayload) -> Result<LoggerRecord> {
|
||||
let message = payload.message.trim();
|
||||
if message.is_empty() {
|
||||
anyhow::bail!("logger payload message must not be empty");
|
||||
}
|
||||
|
||||
Ok(LoggerRecord {
|
||||
timestamp: Utc::now().to_rfc3339(),
|
||||
action_id: "logger".to_string(),
|
||||
message: message.to_string(),
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn validates_and_serializes_payload() {
|
||||
let payload = LoggerPayload {
|
||||
message: " hello ".to_string(),
|
||||
};
|
||||
let record = build_logger_record(payload).unwrap();
|
||||
assert_eq!(record.action_id, "logger");
|
||||
assert_eq!(record.message, "hello");
|
||||
|
||||
let json = serde_json::to_string(&record).unwrap();
|
||||
assert!(json.contains(r#""action_id":"logger""#));
|
||||
assert!(json.contains(r#""message":"hello""#));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_empty_message() {
|
||||
let result = build_logger_record(LoggerPayload {
|
||||
message: " ".to_string(),
|
||||
});
|
||||
assert!(result.is_err());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
pub mod logger;
|
||||
Reference in New Issue
Block a user