use std::{collections::HashMap, ops::Deref, sync::Arc}; use crate::{Amount, PublicKey}; use cashu::nuts::nut01::{Keys as KeysSdk, Response as KeysResponseSdk}; use cashu::Amount as AmountSdk; pub struct Keys { inner: KeysSdk, } impl Deref for Keys { type Target = KeysSdk; fn deref(&self) -> &Self::Target { &self.inner } } impl From for KeysSdk { fn from(keys: Keys) -> KeysSdk { keys.inner } } impl From for Keys { fn from(keys: KeysSdk) -> Keys { let keys = keys .keys() .into_iter() .map(|(amount, pk)| (amount.to_sat().to_string(), Arc::new(pk.into()))) .collect(); Keys::new(keys) } } impl Keys { pub fn new(keys: HashMap>) -> Self { let keys = keys .into_iter() .map(|(amount, pk)| { ( AmountSdk::from_sat(amount.parse::().unwrap()), pk.as_ref().into(), ) }) .collect(); Self { inner: KeysSdk::new(keys), } } pub fn keys(&self) -> HashMap> { self.inner .keys() .into_iter() .map(|(amount, pk)| (amount.to_sat().to_string(), Arc::new(pk.into()))) .collect() } pub fn amount_key(&self, amount: Arc) -> Option> { self.inner .amount_key(*amount.as_ref().deref()) .map(|pk| Arc::new(pk.into())) } pub fn as_hashmap(&self) -> HashMap { self.inner .as_hashmap() .into_iter() .map(|(amount, pk)| (amount.to_sat().to_string(), pk)) .collect() } } pub struct KeysResponse { inner: KeysResponseSdk, } impl Deref for KeysResponse { type Target = KeysResponseSdk; fn deref(&self) -> &Self::Target { &self.inner } } impl From for KeysResponseSdk { fn from(keys: KeysResponse) -> KeysResponseSdk { keys.inner } } impl From for KeysResponse { fn from(keys: KeysResponseSdk) -> KeysResponse { KeysResponse { inner: keys } } } impl KeysResponse { pub fn new(keys: Arc) -> Self { Self { inner: KeysResponseSdk { keys: keys.as_ref().deref().clone(), }, } } }