taskter 0.1.0

Taskter is a terminal Kanban board CLI tool built with Rust.
Documentation
use anyhow::{anyhow, Result};
use serde_json::Value;

use crate::agent::FunctionDeclaration;
use crate::store::{self, KeyResult, Okr};

const DECL_JSON: &str = include_str!("../../tools/add_okr.json");

pub fn declaration() -> FunctionDeclaration {
    serde_json::from_str(DECL_JSON).expect("invalid add_okr.json")
}

pub fn execute(args: &Value) -> Result<String> {
    let objective = args["objective"]
        .as_str()
        .ok_or_else(|| anyhow!("objective missing"))?;
    let key_results = args["key_results"]
        .as_array()
        .ok_or_else(|| anyhow!("key_results missing"))?;

    let mut okrs = store::load_okrs()?;
    let mut kr_list = Vec::new();
    for kr in key_results {
        if let Some(name) = kr.as_str() {
            kr_list.push(KeyResult {
                name: name.to_string(),
                progress: 0.0,
            });
        }
    }

    okrs.push(Okr {
        objective: objective.to_string(),
        key_results: kr_list,
    });
    store::save_okrs(&okrs)?;
    Ok(format!("Added OKR '{objective}'"))
}