use crate::models::field_names;
use anyhow::Result;
use clap::Args;
use serde_json::{Value, json};
use crate::cli::CliOutput;
use crate::storage as db;
#[derive(Args, Debug, Clone)]
pub struct SubscriptionDlqListArgs {
#[arg(long = "subscription-id", value_name = "ID")]
pub subscription_id: Option<String>,
#[arg(long, value_name = "N")]
pub limit: Option<u32>,
#[arg(long)]
pub json: bool,
}
pub fn cmd_subscription_dlq_list(
db_path: &std::path::Path,
args: &SubscriptionDlqListArgs,
out: &mut CliOutput<'_>,
) -> Result<()> {
let conn = db::open(db_path)?;
let mut params = json!({});
if let Some(s) = &args.subscription_id {
params[field_names::SUBSCRIPTION_ID] = json!(s);
}
if let Some(l) = args.limit {
params["limit"] = json!(l);
}
let envelope = crate::mcp::handle_subscription_dlq_list(&conn, ¶ms, None)
.map_err(|e| anyhow::anyhow!("subscription-dlq-list: {e}"))?;
if args.json {
writeln!(out.stdout, "{}", serde_json::to_string(&envelope)?)?;
return Ok(());
}
let count = envelope.get("count").and_then(Value::as_u64).unwrap_or(0);
writeln!(out.stdout, "subscription-dlq-list: {count} entry(ies)")?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::cli::test_utils::TestEnv;
#[test]
fn subscription_dlq_list_cli_empty_db_returns_zero() {
let mut env = TestEnv::fresh();
let db = env.db_path.clone();
let args = SubscriptionDlqListArgs {
subscription_id: None,
limit: None,
json: true,
};
{
let mut out = env.output();
cmd_subscription_dlq_list(&db, &args, &mut out).expect("ok");
}
let stdout = env.stdout_str();
let envelope: Value = serde_json::from_str(stdout.trim()).expect("parse envelope");
assert_eq!(envelope["count"].as_u64(), Some(0));
}
#[test]
fn subscription_dlq_list_cli_text_output_with_params() {
let mut env = TestEnv::fresh();
let db = env.db_path.clone();
let args = SubscriptionDlqListArgs {
subscription_id: Some("sub-123".into()),
limit: Some(50),
json: false,
};
{
let mut out = env.output();
cmd_subscription_dlq_list(&db, &args, &mut out).expect("ok");
}
assert!(
env.stdout_str()
.contains("subscription-dlq-list: 0 entry(ies)")
);
}
}