use std::fs;
use std::path::PathBuf;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(default)]
pub struct Entry {
commandexit: Option<String>,
commandstart: Option<String>,
path: PathBuf,
name: String,
current: u8,
}
impl Default for Entry {
fn default() -> Self {
Entry {
name: "".to_string(),
path: PathBuf::from(""),
current: 0,
commandstart: Some("NvimTreeToggle".to_string()),
commandexit: Some("".to_string()),
}
}
}
pub fn add_project(
target_path: PathBuf,
workspace: PathBuf,
host: String,
group: String,
name: String,
debug: bool,
) {
let json_data = fs::read_to_string(&target_path).unwrap_or("[]".to_string());
let mut entries: Vec<Entry> =
serde_json::from_str(&json_data).expect("JSON was not well-formed");
let must_add = !entries.iter().any(|e| e.path == workspace);
if debug && !must_add {
println!("Entry already exist {:?}.", workspace);
}
if must_add {
let new_entry = Entry {
name: format!("{}/{}/{}", host, group, name),
path: workspace,
..Entry::default()
};
entries.push(new_entry.clone());
let updated_data =
serde_json::to_string_pretty(&entries).expect("Failed to serialize JSON");
let _ = fs::create_dir_all(&target_path.parent().unwrap());
fs::write(&target_path, updated_data).expect("Unable to write file");
if debug {
println!("Entry added {:#?}", new_entry);
}
}
}