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}