use anyhow::{Result, anyhow};
use colored::Colorize;
use std::{
path::{Path, PathBuf},
process::Command,
};
use crate::{get_git_path, read_yaml};
pub fn open(module: &PathBuf) -> Result<()> {
eprintln!(
"{}: {}",
"opening".green(),
module.file_name().unwrap().to_str().unwrap().italic(),
);
match read_yaml(module) {
Ok(para_yaml) => {
for git in para_yaml.gits {
if let Err(e) = init_git(&git, module) {
eprintln!("{}: {}", e.to_string().red(), &git.italic());
}
}
if let Some(cmd) = para_yaml.open
&& !cmd.is_empty()
{
let mut command = Command::new(cmd.first().unwrap());
for arg in cmd[1..].iter() {
command.arg(arg);
}
command.current_dir(module);
if command.status().is_err() {
eprintln!("{}", "failed to spawn `open` command from para.yaml".red());
};
}
}
Err(e) => {
eprintln!(
"{}",
format!("Error opening para.yaml: {}", e).green().italic()
);
}
}
let shell = std::env::var("SHELL").unwrap_or("bash".to_string());
Command::new(shell)
.current_dir(module)
.env("MOD", module)
.status()?;
Ok(())
}
pub fn edit_note(note: PathBuf) -> Result<()> {
Command::new("code")
.arg(note)
.status()
.or(Err(anyhow!("Couldn't start vim")))?;
Ok(())
}
fn init_git(git: &str, module: &Path) -> Result<()> {
let name = match git.split('/').next_back() {
Some(n) => n.trim_end_matches(".git"),
None => return Err(anyhow!("para.yaml git url invalid")),
};
if module.join(name).exists() {
return Ok(());
} else {
if module.join(name).is_symlink() {
std::fs::remove_file(module.join(name))?;
}
}
let original = get_git_path()?.join(name);
if !original.exists() {
let status = Command::new("git")
.arg("clone")
.arg(git)
.arg(&original)
.status()?;
if !status.success() {
return Err(anyhow!("git clone failed"));
}
}
std::os::unix::fs::symlink(original, module.join(name))?;
Ok(())
}