bhwi-async 0.1.0

Async HWI trait over the bhwi sans-IO Bitcoin hardware wallet interpreters
Documentation
use crate::{HttpClient, Transport};
use bhwi::{
    Interpreter,
    bitcoin::Network,
    jade::{JadeCommand, JadeError, JadeInterpreter, JadeResponse, JadeTransmit},
};

/// An asynchronous Jade client with device and PIN-server I/O.
pub struct Jade<T, S> {
    /// The network used by the Jade interpreter.
    pub network: Network,
    /// The transport used for device exchanges.
    pub transport: T,
    /// The HTTP client used for interpreter-routed PIN-server requests.
    pub pinserver: S,
}

impl<T, S> Jade<T, S> {
    /// Creates a client with the selected network, transport, and PIN-server client.
    pub fn new(network: Network, transport: T, pinserver: S) -> Self {
        Self {
            network,
            transport,
            pinserver,
        }
    }
}

impl<C, T, R, E, F, H> crate::CommonInterface<C, T, R, E> for Jade<F, H>
where
    C: TryInto<JadeCommand, Error = E>,
    T: From<JadeTransmit>,
    R: From<JadeResponse>,
    E: From<JadeError>,
    F: Transport,
    H: HttpClient,
{
    type TransportError = F::Error;
    type HttpClientError = H::Error;
    fn components(
        &mut self,
    ) -> (
        &mut (dyn Transport<Error = Self::TransportError> + '_),
        &(dyn HttpClient<Error = Self::HttpClientError> + '_),
        Option<&mut (dyn crate::HostInteraction + 'static)>,
        impl Interpreter<Command = C, Transmit = T, Response = R, Error = E>,
    ) {
        (
            &mut self.transport,
            &self.pinserver,
            None,
            JadeInterpreter::default().with_network(self.network),
        )
    }
}

impl<T, S> crate::OnUnlock for Jade<T, S> {
    fn on_unlock(&mut self, _response: bhwi::common::Response) -> Result<(), bhwi::common::Error> {
        Ok(())
    }
}