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