mod.rs

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