1use anyhow::Result;
2use serde::Serialize;
3use std::path::Path;
4
5use crate::db;
6
7#[derive(Serialize)]
8struct ExportTask {
9 #[serde(flatten)]
10 task: db::Task,
11 labels: Vec<String>,
12 blockers: Vec<String>,
13 logs: Vec<db::LogEntry>,
14}
15
16pub fn run(root: &Path) -> Result<()> {
17 let conn = db::open(root)?;
18
19 let mut stmt = conn.prepare(
20 "SELECT id, title, description, type, priority, status, effort, parent, created, updated
21 FROM tasks ORDER BY id",
22 )?;
23
24 let tasks: Vec<db::Task> = stmt
25 .query_map([], db::row_to_task)?
26 .collect::<rusqlite::Result<_>>()?;
27
28 for t in &tasks {
29 let labels = db::load_labels(&conn, &t.id)?;
30 let blockers = db::load_blockers(&conn, &t.id)?;
31 let logs = db::load_logs(&conn, &t.id)?;
32 let detail = ExportTask {
33 task: db::Task {
34 id: t.id.clone(),
35 title: t.title.clone(),
36 description: t.description.clone(),
37 task_type: t.task_type.clone(),
38 priority: t.priority,
39 status: t.status.clone(),
40 effort: t.effort,
41 parent: t.parent.clone(),
42 created: t.created.clone(),
43 updated: t.updated.clone(),
44 },
45 labels,
46 blockers,
47 logs,
48 };
49 println!("{}", serde_json::to_string(&detail)?);
50 }
51
52 Ok(())
53}