clipmem 0.5.4

macOS clipboard memory backed by SQLite and searchable from agent runtimes
Documentation
use std::fmt::Write;

use serde_json::Value;

use crate::db::StatsSnapshotLeaderboardEntry;

use super::row_text::truncate_for_display;

pub(in crate::cli) fn render_filter_pairs(filters: &Value) -> String {
    let Some(object) = filters.as_object() else {
        return "none".to_string();
    };

    object
        .iter()
        .map(|(key, value)| {
            let rendered = match value {
                Value::Null => "null".to_string(),
                Value::String(text) => text.clone(),
                other => other.to_string(),
            };
            format!("{key}={rendered}")
        })
        .collect::<Vec<_>>()
        .join(", ")
}

pub(in crate::cli) fn escape_markdown_cell(value: &str) -> String {
    value.replace('|', "\\|")
}

pub(in crate::cli) fn truncate_for_markdown(value: &str, limit: usize) -> String {
    truncate_for_display(value, limit)
}

pub(in crate::cli) fn push_blank_line(out: &mut String) {
    out.push('\n');
}

pub(in crate::cli) fn push_snapshot_leaderboard(
    out: &mut String,
    snapshots: &[StatsSnapshotLeaderboardEntry],
    indent: usize,
) {
    if snapshots.is_empty() {
        let _ = writeln!(out, "{}none", " ".repeat(indent));
        return;
    }

    for snapshot in snapshots {
        push_snapshot_leaderboard_entry(out, snapshot, indent);
    }
}

pub(in crate::cli) fn push_snapshot_leaderboard_entry(
    out: &mut String,
    snapshot: &StatsSnapshotLeaderboardEntry,
    indent: usize,
) {
    let prefix = " ".repeat(indent);
    let app = snapshot.app_name().unwrap_or("Unknown");
    let preview = if snapshot.preview_text().trim().is_empty() {
        "(no preview)".to_string()
    } else {
        truncate_for_markdown(&snapshot.preview_text().replace('\n', " "), 120)
    };
    let _ = writeln!(
        out,
        "{prefix}[{}] {} captures, {}, {} bytes, last seen {}, {}",
        snapshot.snapshot_id(),
        snapshot.capture_count(),
        snapshot.kind(),
        snapshot.total_bytes(),
        format_utc_timestamp(snapshot.last_observed_at()),
        app
    );
    let _ = writeln!(out, "{prefix}  preview: {preview}");
}

pub(in crate::cli) fn format_utc_timestamp(timestamp: &str) -> String {
    if timestamp.ends_with('Z')
        || timestamp.ends_with(" UTC")
        || timestamp.contains('+')
        || timestamp.rfind('-').is_some_and(|idx| idx > 9)
    {
        timestamp.to_string()
    } else {
        format!("{timestamp} UTC")
    }
}