mod.rs

  1mod compact;
  2mod create;
  3mod dep;
  4mod done;
  5mod export;
  6mod import;
  7mod init;
  8mod label;
  9mod list;
 10mod log;
 11mod next;
 12mod projects;
 13mod ready;
 14mod reopen;
 15mod rm;
 16mod search;
 17mod show;
 18mod skill;
 19mod stats;
 20mod update;
 21mod r#use;
 22
 23use crate::cli::{Cli, Command};
 24use crate::db;
 25use anyhow::Result;
 26
 27fn require_root() -> Result<std::path::PathBuf> {
 28    std::env::current_dir().map_err(Into::into)
 29}
 30
 31pub fn dispatch(cli: &Cli) -> Result<()> {
 32    if let Some(project) = &cli.project {
 33        std::env::set_var(db::PROJECT_ENV, project);
 34    }
 35
 36    match &cli.command {
 37        Command::Init { name } => {
 38            let root = std::env::current_dir()?;
 39            init::run(&root, name, cli.json)
 40        }
 41        Command::Use { name } => r#use::run(name, cli.json),
 42        Command::Projects => projects::run(cli.json),
 43        Command::Create {
 44            title,
 45            priority,
 46            effort,
 47            task_type,
 48            desc,
 49            parent,
 50            labels,
 51        } => {
 52            let root = require_root()?;
 53            create::run(
 54                &root,
 55                create::Opts {
 56                    title: title.as_deref(),
 57                    priority: db::parse_priority(priority)?,
 58                    effort: db::parse_effort(effort)?,
 59                    task_type,
 60                    desc: desc.as_deref(),
 61                    parent: parent.as_deref(),
 62                    labels: labels.as_deref(),
 63                    json: cli.json,
 64                },
 65            )
 66        }
 67        Command::List {
 68            status,
 69            priority,
 70            effort,
 71            label,
 72        } => {
 73            let root = require_root()?;
 74            let pri = priority.as_deref().map(db::parse_priority).transpose()?;
 75            let eff = effort.as_deref().map(db::parse_effort).transpose()?;
 76            list::run(
 77                &root,
 78                status.as_deref(),
 79                pri,
 80                eff,
 81                label.as_deref(),
 82                cli.json,
 83            )
 84        }
 85        Command::Show { id } => {
 86            let root = require_root()?;
 87            show::run(&root, id, cli.json)
 88        }
 89        Command::Log { id, message } => {
 90            let root = require_root()?;
 91            log::run(&root, id, message, cli.json)
 92        }
 93        Command::Update {
 94            id,
 95            status,
 96            priority,
 97            effort,
 98            title,
 99            desc,
100        } => {
101            let root = require_root()?;
102            let pri = priority.as_deref().map(db::parse_priority).transpose()?;
103            let eff = effort.as_deref().map(db::parse_effort).transpose()?;
104            update::run(
105                &root,
106                id,
107                update::Opts {
108                    status: status.as_deref(),
109                    priority: pri,
110                    effort: eff,
111                    title: title.as_deref(),
112                    desc: desc.as_deref(),
113                    json: cli.json,
114                },
115            )
116        }
117        Command::Done { ids } => {
118            let root = require_root()?;
119            done::run(&root, ids, cli.json)
120        }
121        Command::Rm {
122            force,
123            recursive,
124            ids,
125        } => {
126            let root = require_root()?;
127            rm::run(&root, ids, *recursive, *force, cli.json)
128        }
129        Command::Reopen { ids } => {
130            let root = require_root()?;
131            reopen::run(&root, ids, cli.json)
132        }
133        Command::Dep { action } => {
134            let root = require_root()?;
135            dep::run(&root, action, cli.json)
136        }
137        Command::Label { action } => {
138            let root = require_root()?;
139            label::run(&root, action, cli.json)
140        }
141        Command::Search { query } => {
142            let root = require_root()?;
143            search::run(&root, query, cli.json)
144        }
145        Command::Ready => {
146            let root = require_root()?;
147            ready::run(&root, cli.json)
148        }
149        Command::Next {
150            mode,
151            verbose,
152            limit,
153        } => {
154            let root = require_root()?;
155            next::run(&root, mode, *verbose, *limit, cli.json)
156        }
157        Command::Stats => {
158            let root = require_root()?;
159            stats::run(&root)
160        }
161        Command::Compact => {
162            let root = require_root()?;
163            compact::run(&root)
164        }
165        Command::Export => {
166            let root = require_root()?;
167            export::run(&root)
168        }
169        Command::Import { file } => {
170            let root = require_root()?;
171            import::run(&root, file)
172        }
173        Command::Skill { dir } => skill::run(dir.as_deref()),
174    }
175}