use std::path::Path; use std::path::PathBuf; use std::sync::Arc; pub trait RolloutConfigView { fn codex_home(&self) -> &Path; fn sqlite_home(&self) -> &Path; fn cwd(&self) -> &Path; fn model_provider_id(&self) -> &str; fn generate_memories(&self) -> bool; } #[derive(Clone, Debug, PartialEq, Eq)] pub struct RolloutConfig { pub codex_home: PathBuf, pub sqlite_home: PathBuf, pub cwd: PathBuf, pub model_provider_id: String, pub generate_memories: bool, } pub type Config = RolloutConfig; impl RolloutConfig { pub fn from_view(view: &impl RolloutConfigView) -> Self { Self { codex_home: view.codex_home().to_path_buf(), sqlite_home: view.sqlite_home().to_path_buf(), cwd: view.cwd().to_path_buf(), model_provider_id: view.model_provider_id().to_string(), generate_memories: view.generate_memories(), } } } impl RolloutConfigView for RolloutConfig { fn codex_home(&self) -> &Path { self.codex_home.as_path() } fn sqlite_home(&self) -> &Path { self.sqlite_home.as_path() } fn cwd(&self) -> &Path { self.cwd.as_path() } fn model_provider_id(&self) -> &str { self.model_provider_id.as_str() } fn generate_memories(&self) -> bool { self.generate_memories } } impl RolloutConfigView for &T { fn codex_home(&self) -> &Path { (*self).codex_home() } fn sqlite_home(&self) -> &Path { (*self).sqlite_home() } fn cwd(&self) -> &Path { (*self).cwd() } fn model_provider_id(&self) -> &str { (*self).model_provider_id() } fn generate_memories(&self) -> bool { (*self).generate_memories() } } impl RolloutConfigView for Arc { fn codex_home(&self) -> &Path { self.as_ref().codex_home() } fn sqlite_home(&self) -> &Path { self.as_ref().sqlite_home() } fn cwd(&self) -> &Path { self.as_ref().cwd() } fn model_provider_id(&self) -> &str { self.as_ref().model_provider_id() } fn generate_memories(&self) -> bool { self.as_ref().generate_memories() } }