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}