use std::path::Path; use std::process::exit; use urlencoding::encode; use crate::db::Database; use crate::identity::{escape, IdKeyData}; pub fn list_keys(db_path: &Path, local_only: bool, peer_only: bool, full_pks: bool) -> anyhow::Result<()> { if local_only && peer_only { eprintln!("cannot show only local and only peer keys, pick one"); exit(1); } let show_local = !peer_only; let show_peer = !full_pks; let db = Database::load_or_create(db_path)?; let mut displayed = 0; for key in &db.keys { match key.keys { IdKeyData::Local(_) => { if !show_local { continue }; displayed += 1; println!("local: {:?}", key); } IdKeyData::Peer(_) => { if !show_peer { continue }; displayed += 1; println!("peer: {:?}", key); } } if full_pks { println!(" pk: sage/{}/{}/{}", key.keys.pk()?, escape(key.name.clone()), escape(key.email.clone())); } else { println!(" id: {}", key.keys.keyid()?); } } if displayed == 0 { println!("no keys found"); } Ok(()) }