use crate::compsys::ported::_message::_message;
use crate::ported::modules::zutil::{lookupstyle, testforstyle};
use crate::ported::params::{getaparam, getsparam};
use std::fs;
use std::path::Path;
pub fn _store_cache(args: &[String]) -> i32 {
let cache_ident = args.first().cloned().unwrap_or_default();
let curcontext = getsparam("curcontext").unwrap_or_default();
let ctx = format!(":completion:{}:", curcontext);
if testforstyle(&ctx, "use-cache") != 0 {
return 1;
}
let cache_dir = lookupstyle(&ctx, "cache-path")
.first()
.cloned()
.unwrap_or_else(|| {
let home = getsparam("ZDOTDIR")
.filter(|s| !s.is_empty())
.or_else(|| getsparam("HOME"))
.unwrap_or_default();
format!("{}/.zcompcache", home)
});
let dir_path = Path::new(&cache_dir);
if !dir_path.is_dir() {
if dir_path.exists() {
let _ = _message(&[
"cache-dir style points to a non-directory!".to_string()
]);
return 1;
}
if fs::create_dir_all(dir_path).is_err() {
let _ = _message(&[format!("couldn't create cache-dir {}", cache_dir)]);
return 1;
}
}
let cache_path = format!("{}/{}", cache_dir, cache_ident);
let ident_dir = Path::new(&cache_path)
.parent()
.map(|p| p.to_path_buf());
if let Some(p) = ident_dir.as_ref() {
if !p.exists() {
if fs::create_dir_all(p).is_err() {
let _ = _message(&[format!(
"couldn't create cache-ident_dir {}",
p.display()
)]);
return 1;
}
}
}
let var_names: &[String] = if args.is_empty() { &[] } else { &args[1..] };
let mut serialized = String::new();
for var in var_names {
if let Some(arr) = getaparam(var) {
serialized.push_str(&format!("{}=( ", var));
for v in &arr {
serialized.push('\'');
serialized.push_str(&v.replace('\'', "'\\''"));
serialized.push_str("' ");
}
serialized.push_str(")\n");
} else if let Some(s) = getsparam(var) {
serialized.push_str(&format!(
"{}='{}'\n",
var,
s.replace('\'', "'\\''")
));
}
}
if fs::write(&cache_path, serialized).is_err() {
return 1;
}
0
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn returns_one_when_use_cache_disabled() {
let _g = crate::test_util::global_state_lock();
assert_eq!(_store_cache(&["test-cache".to_string()]), 1);
}
}