2025-05-10 10:20:26 +02:00
|
|
|
use std::path::PathBuf;
|
|
|
|
|
|
2025-05-24 13:28:56 +02:00
|
|
|
use rustyline::{Editor, history::FileHistory};
|
2025-05-10 10:20:26 +02:00
|
|
|
|
|
|
|
|
fn xdg_state_dir() -> Option<PathBuf> {
|
|
|
|
|
if let Ok(dir) = std::env::var("XDG_STATE_DIR") {
|
|
|
|
|
Some(PathBuf::from(dir))
|
|
|
|
|
} else if let Ok(home) = std::env::var("HOME") {
|
|
|
|
|
if home.is_empty() {
|
|
|
|
|
None
|
|
|
|
|
} else {
|
|
|
|
|
Some(PathBuf::from(home).join(".local/state"))
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn state_dir() -> Option<PathBuf> {
|
|
|
|
|
if let Some(dir) = xdg_state_dir() {
|
|
|
|
|
let dir = dir.join("osdb");
|
|
|
|
|
std::fs::create_dir_all(&dir).ok()?;
|
|
|
|
|
Some(dir)
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn history_file() -> Option<std::path::PathBuf> {
|
|
|
|
|
if let Some(state) = state_dir() {
|
|
|
|
|
Some(state.join("cli_history"))
|
|
|
|
|
} else {
|
|
|
|
|
eprintln!("Warning: failed to find or create XDG_STATE_DIR for osdb.");
|
2025-05-24 13:28:56 +02:00
|
|
|
eprintln!(
|
|
|
|
|
"Warning: either set XDG_STATE_DIR or HOME, and ensure osdb has write permissions to that directory."
|
|
|
|
|
);
|
2025-05-10 10:20:26 +02:00
|
|
|
None
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-05-02 20:35:45 +02:00
|
|
|
|
2025-05-09 17:16:05 +02:00
|
|
|
pub fn read_input(rl: &mut Editor<(), FileHistory>) -> Option<String> {
|
2025-05-10 10:20:26 +02:00
|
|
|
if let Ok(result) = rl.readline("osdb> ") {
|
|
|
|
|
let _ = rl.add_history_entry(&result);
|
|
|
|
|
Some(result)
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
}
|
2025-05-02 20:35:45 +02:00
|
|
|
}
|