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