nils-memo-cli 0.3.3

CLI crate for nils-memo-cli in the nils-cli workspace.
Documentation
use serde_json::json;

use crate::cli::OutputMode;
use crate::errors::AppError;
use crate::output::{emit_json_results_with_meta, format_item_id, text};
use crate::storage::Storage;
use crate::storage::repository::{self, QueryState};

pub fn run(
    storage: &Storage,
    output_mode: OutputMode,
    state: QueryState,
    limit: usize,
    offset: usize,
) -> Result<(), AppError> {
    let rows =
        storage.with_connection(|conn| repository::list_items(conn, state, limit, offset))?;

    if output_mode.is_json() {
        let results = rows
            .iter()
            .map(|row| {
                json!({
                    "item_id": format_item_id(row.item_id),
                    "created_at": row.created_at,
                    "state": row.state,
                    "text_preview": row.text_preview,
                    "content_type": row.content_type,
                    "validation_status": row.validation_status,
                })
            })
            .collect::<Vec<_>>();
        return emit_json_results_with_meta(
            "memo-cli.list.v1",
            "memo-cli list",
            results,
            Some(json!({
                "limit": limit,
                "offset": offset,
                "returned": rows.len(),
            })),
            None,
        );
    }

    text::print_list(&rows);

    Ok(())
}