feat: scaffold rust llm module controller
CI / validate (push) Successful in 35s

This commit is contained in:
2026-07-21 11:10:20 -05:00
commit b445d8a117
23 changed files with 2888 additions and 0 deletions
+73
View File
@@ -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());
}
}
+1
View File
@@ -0,0 +1 @@
pub mod logger;