1use crate::{cli::VarCmd as Cmd, env::Variables, Ctx, PairMap, QuartzResult};
2use std::process::ExitCode;
3
4#[derive(clap::Args, Debug)]
5pub struct GetArgs {
6 key: String,
7}
8
9#[derive(clap::Args, Debug)]
10pub struct SetArgs {
11 #[arg(name = "VARIABLE", required = true)]
12 variables: Vec<String>,
13}
14
15#[derive(clap::Args, Debug)]
16pub struct RmArgs {
17 #[arg(name = "KEY", required = true)]
18 keys: Vec<String>,
19}
20
21pub fn cmd(ctx: &mut Ctx, command: Cmd) -> QuartzResult {
22 match command {
23 Cmd::Edit => edit(ctx)?,
24 Cmd::Get(args) => get(ctx, args),
25 Cmd::Set(args) => set(ctx, args)?,
26 Cmd::Rm(args) => rm(ctx, args)?,
27 Cmd::Ls => ls(ctx),
28 };
29
30 Ok(())
31}
32
33pub fn get(ctx: &Ctx, args: GetArgs) {
34 let env = ctx.require_env();
35 let v = env
36 .variables
37 .get(&args.key)
38 .unwrap_or_else(|| panic!("{} variable not set", args.key));
39
40 println!("{}", v);
41}
42
43pub fn set(ctx: &Ctx, args: SetArgs) -> QuartzResult {
44 let mut env = ctx.require_env();
45 for input in args.variables {
46 env.variables.set(&input);
47 }
48
49 env.update(ctx)?;
50 Ok(())
51}
52
53pub fn ls(ctx: &Ctx) {
54 let env = ctx.require_env();
55 print!("{}", env.variables);
56}
57
58pub fn edit(ctx: &Ctx) -> QuartzResult {
59 let env = ctx.require_env();
60 ctx.edit(&env.dir(ctx).join("variables"), |c| {
61 Variables::parse(c);
62 Ok(())
63 })?;
64
65 Ok(())
66}
67
68pub fn rm(ctx: &mut Ctx, args: RmArgs) -> QuartzResult {
69 let mut env = ctx.require_env();
70
71 for key in args.keys {
72 env.variables.remove(&key).unwrap_or_else(|| {
73 ctx.code(ExitCode::FAILURE);
74 eprintln!("{}: No such variable", key);
75 "".to_string()
76 });
77 }
78
79 env.update(ctx)?;
80 Ok(())
81}