From 5cee5baa864314cafa3c86a0cc5c41d0175e2fb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Thu, 8 Feb 2024 12:10:31 +0100 Subject: [PATCH] add AnyResolver --- src/resolvers/any.rs | 95 ++++++++++++++++++++++++++++++++++++++++++++ src/resolvers/mod.rs | 1 + 2 files changed, 96 insertions(+) create mode 100644 src/resolvers/any.rs diff --git a/src/resolvers/any.rs b/src/resolvers/any.rs new file mode 100644 index 0000000..2aef596 --- /dev/null +++ b/src/resolvers/any.rs @@ -0,0 +1,95 @@ +// RGB smart contracts for Bitcoin & Lightning +// +// SPDX-License-Identifier: Apache-2.0 +// +// Written in 2024 by +// Zoe FaltibĂ  +// +// 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 { + impl_inner_method!(AnyResolver, self, resolve_anchor, anchor) + } +} + +impl ResolveWitness for AnyResolver { + fn resolve_pub_witness( + &self, + witness_id: WitnessId, + ) -> Result { + impl_inner_method!(AnyResolver, self, resolve_pub_witness, witness_id) + } +} diff --git a/src/resolvers/mod.rs b/src/resolvers/mod.rs index ecd7ae3..9135c1e 100644 --- a/src/resolvers/mod.rs +++ b/src/resolvers/mod.rs @@ -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")]