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(())
}