export.rs

 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}