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 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}