quartz_cli/action/
init.rs1use 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}