pub fn translate_cli_args_to_batch(raw: &[String], has_subcommand: bool) -> (String, Vec<String>) {
const GLOBAL_FLAGS: &[&str] = &["--json", "-q", "--quiet"];
const GLOBAL_WITH_VALUE: &[&str] = &["--model", "-n", "--limit"];
let mut args: Vec<String> = Vec::with_capacity(raw.len());
let mut skip_next = false;
for arg in raw.iter() {
if skip_next {
skip_next = false;
continue;
}
if GLOBAL_FLAGS.contains(&arg.as_str()) {
continue;
}
if let Some((key, value)) = arg.split_once('=') {
if key == "-n" || key == "--limit" {
args.push(format!("--limit={}", value));
continue;
}
if key == "--model" {
continue;
}
if GLOBAL_FLAGS.contains(&key) {
continue;
}
}
if GLOBAL_WITH_VALUE.contains(&arg.as_str()) {
if arg == "-n" || arg == "--limit" {
args.push("--limit".to_string());
continue;
}
skip_next = true;
continue;
}
args.push(arg.clone());
}
if !has_subcommand {
return ("search".to_string(), args);
}
if let Some((first, rest)) = args.split_first() {
(first.clone(), rest.to_vec())
} else {
(String::new(), Vec::new())
}
}
pub fn stripped_model_value(raw: &[String]) -> Option<String> {
let mut it = raw.iter();
while let Some(arg) = it.next() {
if arg == "--model" {
return it.next().cloned();
}
if let Some(rest) = arg.strip_prefix("--model=") {
return Some(rest.to_string());
}
}
None
}
#[cfg(unix)]
pub fn daemon_socket_path(cqs_dir: &std::path::Path) -> std::path::PathBuf {
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
use std::path::PathBuf;
let sock_dir = std::env::var("XDG_RUNTIME_DIR")
.map(PathBuf::from)
.unwrap_or_else(|_| std::env::temp_dir());
let sock_name = format!("cqs-{:x}.sock", {
let mut h = DefaultHasher::new();
cqs_dir.hash(&mut h);
h.finish()
});
sock_dir.join(sock_name)
}
#[cfg(test)]
mod tests {
use super::*;
fn v(tokens: &[&str]) -> Vec<String> {
tokens.iter().map(|s| s.to_string()).collect()
}
#[test]
fn strips_json_bare_query() {
let (cmd, args) = translate_cli_args_to_batch(&v(&["--json", "search me"]), false);
assert_eq!(cmd, "search");
assert_eq!(args, v(&["search me"]));
}
#[test]
fn remaps_dash_n_spaced() {
let (cmd, args) = translate_cli_args_to_batch(&v(&["impact", "foo", "-n", "5"]), true);
assert_eq!(cmd, "impact");
assert_eq!(args, v(&["foo", "--limit", "5"]));
}
#[test]
fn stripped_model_value_spaced_form() {
assert_eq!(
stripped_model_value(&v(&["search", "q", "--model", "bge-large"])),
Some("bge-large".to_string())
);
}
#[test]
fn stripped_model_value_equals_form() {
assert_eq!(
stripped_model_value(&v(&["search", "q", "--model=bge-large"])),
Some("bge-large".to_string())
);
}
}