Skip to content

Commit

Permalink
add AnyResolver
Browse files Browse the repository at this point in the history
  • Loading branch information
zoedberg committed Feb 8, 2024
1 parent 3d30537 commit 5cee5ba
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 0 deletions.
95 changes: 95 additions & 0 deletions src/resolvers/any.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
// RGB smart contracts for Bitcoin & Lightning
//
// SPDX-License-Identifier: Apache-2.0
//
// Written in 2024 by
// Zoe Faltibà <[email protected]>
//
// Copyright (C) 2024 LNP/BP Standards Association. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use rgbstd::resolvers::ResolveHeight;
use rgbstd::validation::{ResolveWitness, WitnessResolverError};
use rgbstd::{WitnessAnchor, WitnessId, XAnchor, XPubWitness};

#[cfg(feature = "electrum")]
use crate::electrum;
#[cfg(feature = "esplora_blocking")]
use crate::esplora_blocking;

/// Type that contains any of the [`Resolver`] types defined by the library
pub enum AnyResolver {
#[cfg(feature = "electrum")]
/// Electrum resolver
Electrum(electrum::Resolver),
#[cfg(feature = "esplora_blocking")]
/// Esplora resolver
Esplora(esplora_blocking::Resolver),
}

#[allow(clippy::large_enum_variant)]
#[derive(Debug, Display, Error, From)]
#[display(doc_comments)]
pub enum AnyAnchorResolverError {
#[cfg(feature = "electrum")]
#[from]
#[display(inner)]
Electrum(electrum::AnchorResolverError),
#[cfg(feature = "esplora_blocking")]
#[from]
#[display(inner)]
Esplora(esplora_blocking::AnchorResolverError),
}

macro_rules! impl_from {
( $from:ty, $to:ty, $variant:ident, $( $cfg:tt )* ) => {
$( $cfg )*
impl From<$from> for $to {
fn from(inner: $from) -> Self {
<$to>::$variant(inner)
}
}
};
}

macro_rules! impl_inner_method {
( $enum_name:ident, $self:expr, $name:ident $(, $args:expr)* ) => {
match $self {
#[cfg(feature = "electrum")]
$enum_name::Electrum(inner) => inner.$name( $($args, )* ).map_err(|e| e.into()),
#[cfg(feature = "esplora_blocking")]
$enum_name::Esplora(inner) => inner.$name( $($args, )* ).map_err(|e| e.into()),
}
}
}

impl_from!(electrum::Resolver, AnyResolver, Electrum, #[cfg(feature = "electrum")]);
impl_from!(esplora_blocking::Resolver, AnyResolver, Esplora, #[cfg(feature = "esplora_blocking")]);

impl ResolveHeight for AnyResolver {
type Error = AnyAnchorResolverError;

fn resolve_anchor(&mut self, anchor: &XAnchor) -> Result<WitnessAnchor, Self::Error> {
impl_inner_method!(AnyResolver, self, resolve_anchor, anchor)
}
}

impl ResolveWitness for AnyResolver {
fn resolve_pub_witness(
&self,
witness_id: WitnessId,
) -> Result<XPubWitness, WitnessResolverError> {
impl_inner_method!(AnyResolver, self, resolve_pub_witness, witness_id)
}
}
1 change: 1 addition & 0 deletions src/resolvers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

pub mod any;
#[cfg(feature = "esplora_blocking")]
pub mod esplora_blocking;
#[cfg(feature = "electrum")]
Expand Down

0 comments on commit 5cee5ba

Please sign in to comment.