beam-daemon 0.5.0

Daemon process for beam that receives Feishu/Lark events and manages coding sessions
Documentation
use super::*;

pub(crate) async fn load_workflow_approval_cards(
    paths: &BeamPaths,
    run_id: &str,
) -> Result<HashMap<String, FrozenCard>> {
    let path = paths.workflow_approval_cards_json(run_id);
    match tokio::fs::read_to_string(&path).await {
        Ok(raw) => {
            let parsed = serde_json::from_str::<HashMap<String, FrozenCard>>(&raw)
                .context("failed to parse workflow approval cards")?;
            Ok(parsed)
        }
        Err(err) if err.kind() == std::io::ErrorKind::NotFound => Ok(HashMap::new()),
        Err(err) => Err(err.into()),
    }
}

pub(crate) async fn save_workflow_approval_cards(
    paths: &BeamPaths,
    run_id: &str,
    cards: &HashMap<String, FrozenCard>,
) -> Result<()> {
    let dir = paths.workflow_approval_cards_dir();
    tokio::fs::create_dir_all(&dir).await?;
    let path = paths.workflow_approval_cards_json(run_id);
    if cards.is_empty() {
        let _ = tokio::fs::remove_file(&path).await;
        return Ok(());
    }
    let tmp = path.with_extension("json.tmp");
    let body = serde_json::to_string_pretty(cards)?;
    tokio::fs::write(&tmp, body).await?;
    tokio::fs::rename(&tmp, &path).await?;
    Ok(())
}