//src/model.rs use rusqlite::{params, Connection, Result as SqlResult}; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] pub struct AiSystem { pub personality: Personality, pub relationship: Relationship, pub environment: Environment, pub messaging: Messaging, } impl AiSystem { pub fn save_to_db(&self, conn: &Connection) -> SqlResult<()> { conn.execute( "CREATE TABLE IF NOT EXISTS ai_state (id INTEGER PRIMARY KEY, json TEXT)", [], )?; let json_data = serde_json::to_string(self).map_err(|e| { rusqlite::Error::ToSqlConversionFailure(Box::new(e)) })?; conn.execute( "INSERT OR REPLACE INTO ai_state (id, json) VALUES (?1, ?2)", params![1, json_data], )?; Ok(()) } pub fn load_from_db(conn: &Connection) -> SqlResult { let mut stmt = conn.prepare("SELECT json FROM ai_state WHERE id = ?1")?; let json: String = stmt.query_row(params![1], |row| row.get(0))?; // ここも serde_json のエラーを map_err で変換 let system: AiSystem = serde_json::from_str(&json).map_err(|e| { rusqlite::Error::FromSqlConversionFailure(0, rusqlite::types::Type::Text, Box::new(e)) })?; Ok(system) } } #[derive(Debug, Serialize, Deserialize)] pub struct Personality { pub kind: String, // e.g., "positive", "negative", "neutral" pub strength: f32, // 0.0 - 1.0 } #[derive(Debug, Serialize, Deserialize)] pub struct Relationship { pub trust: f32, // 0.0 - 1.0 pub intimacy: f32, // 0.0 - 1.0 pub curiosity: f32, // 0.0 - 1.0 pub threshold: f32, // if sum > threshold, allow messaging } #[derive(Debug, Serialize, Deserialize)] pub struct Environment { pub luck_today: f32, // 0.1 - 1.0 pub luck_history: Vec, // last 3 values pub level: i32, // current mental strength level } #[derive(Debug, Serialize, Deserialize)] pub struct Messaging { pub enabled: bool, pub schedule_time: Option, // e.g., "08:00" pub decay_rate: f32, // how quickly emotion fades (0.0 - 1.0) pub templates: Vec, // message template variations }