use rgbstd::contract::AssignmentsFilter;
use rgbstd::{Outpoint, Txid};
use crate::WalletProvider;
#[derive(Copy, Clone)]
pub enum Filter {
Outpoints,
Unspent,
Witness,
}
pub struct WalletFilter<'wallet, W: WalletProvider + ?Sized> {
wallet: &'wallet W,
filter: Filter,
}
impl<'wallet, W: WalletProvider + ?Sized> WalletFilter<'wallet, W> {
pub fn new(wallet: &'wallet W, filter: Filter) -> WalletFilter<'wallet, W> {
Self { wallet, filter }
}
}
impl<W: WalletProvider + ?Sized> Copy for WalletFilter<'_, W> {}
impl<W: WalletProvider + ?Sized> Clone for WalletFilter<'_, W> {
fn clone(&self) -> Self { *self }
}
impl<W: WalletProvider + ?Sized> AssignmentsFilter for WalletFilter<'_, W> {
fn should_include(&self, outpoint: impl Into<Outpoint>, witness_id: Option<Txid>) -> bool {
match self.filter {
Filter::Outpoints => self.wallet.has_outpoint(outpoint.into()),
Filter::Unspent => self.wallet.is_unspent(outpoint.into()),
Filter::Witness => self.wallet.should_include_witness(witness_id),
}
}
}