quartz_cli/action/
init.rs

1use crate::QuartzResult;
2use std::io::Write;
3use std::path::{Path, PathBuf};
4use std::str::FromStr;
5
6use colored::Colorize;
7
8#[derive(clap::Args, Debug)]
9pub struct Args {
10    directory: Option<PathBuf>,
11}
12
13pub fn cmd(args: Args) -> QuartzResult {
14    let directory = args.directory.unwrap_or(Path::new(".").to_path_buf());
15    let quartz_dir = directory.join(".quartz");
16
17    if quartz_dir.exists() {
18        panic!(
19            "quartz already initialized at {}",
20            directory.to_string_lossy()
21        );
22    }
23
24    if std::fs::create_dir(&quartz_dir).is_err() {
25        panic!("failed to initialize quartz project");
26    };
27
28    let ensure_dirs = vec![
29        "endpoints",
30        "user",
31        "user/history",
32        "user/state",
33        "env",
34        "env/default",
35    ];
36
37    for dir in ensure_dirs {
38        if std::fs::create_dir(quartz_dir.join(PathBuf::from_str(dir)?)).is_err() {
39            panic!("failed to create {} directory", dir);
40        }
41    }
42
43    if directory.join(".git").exists() {
44        println!("Git detected");
45        println!("Adding user files to {}", ".gitignore".green());
46
47        if let Ok(mut gitignore) = std::fs::OpenOptions::new()
48            .create(true)
49            .append(true)
50            .open(directory.join(".gitignore"))
51        {
52            let _ = gitignore.write("\n# Quartz\n.quartz/user\n.quartz/env/**/cookies".as_bytes());
53        }
54    }
55
56    println!(
57        "Initialized quartz project in {}",
58        std::fs::canonicalize(quartz_dir.clone())
59            .unwrap_or(quartz_dir)
60            .to_str()
61            .unwrap()
62    );
63
64    Ok(())
65}