use std::path::{Path, PathBuf};
use std::time::SystemTime;
use ratatui::crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
pub(crate) struct HomeSandbox {
_tmp: tempfile::TempDir,
_guard: std::sync::MutexGuard<'static, ()>,
home: PathBuf,
}
impl HomeSandbox {
pub(crate) fn new() -> Self {
let guard = crate::profile::HOME_TEST_LOCK
.lock()
.unwrap_or_else(|e| e.into_inner());
let tmp = tempfile::tempdir().expect("create home sandbox");
let home = tmp.path().to_path_buf();
crate::profile::set_home_override(home.clone());
Self {
_tmp: tmp,
_guard: guard,
home,
}
}
pub(crate) fn home(&self) -> &Path {
&self.home
}
}
impl Drop for HomeSandbox {
fn drop(&mut self) {
crate::profile::clear_home_override();
}
}
pub(crate) fn blank_profile(name: &str) -> crate::profile::Profile {
crate::profile::Profile {
name: name.into(),
base_url: None,
api_key: None,
auto_start: false,
env: Default::default(),
models: Default::default(),
fallback_threshold: None,
bell_threshold: None,
credentials: None,
usage: None,
fetch_status: None,
provider: None,
third_party_usage: None,
}
}
pub(crate) fn set_mtime(path: &Path, when: SystemTime) {
let file = std::fs::OpenOptions::new()
.write(true)
.open(path)
.expect("open for mtime");
file.set_modified(when).expect("set_modified");
}
pub(crate) fn key(code: KeyCode) -> KeyEvent {
KeyEvent::new(code, KeyModifiers::NONE)
}