mod.rs

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