#![allow(clippy::result_large_err)]
#[macro_use]
extern crate amplify;
#[macro_use]
extern crate serde_with;
use amplify::{hex, IoError};
use bpstd::{BlockHash, Txid};
use std::collections::HashMap;
use std::io;
pub mod api;
#[cfg(feature = "async")]
pub mod r#async;
#[cfg(feature = "blocking")]
pub mod blocking;
pub use api::*;
#[cfg(feature = "blocking")]
pub use blocking::BlockingClient;
#[cfg(feature = "async")]
pub use r#async::AsyncClient;
pub fn convert_fee_rate(target: usize, estimates: HashMap<String, f64>) -> Result<f32, Error> {
let fee_val = {
let mut pairs = estimates
.into_iter()
.filter_map(|(k, v)| Some((k.parse::<usize>().ok()?, v)))
.collect::<Vec<_>>();
pairs.sort_unstable_by_key(|(k, _)| std::cmp::Reverse(*k));
pairs
.into_iter()
.find(|(k, _)| k <= &target)
.map(|(_, v)| v)
.unwrap_or(1.0)
};
Ok(fee_val as f32)
}
#[derive(Debug, Clone)]
pub struct Builder {
pub base_url: String,
pub proxy: Option<String>,
pub timeout: Option<u64>,
}
impl Builder {
pub fn new(base_url: &str) -> Self {
Builder {
base_url: base_url.to_string(),
proxy: None,
timeout: None,
}
}
pub fn proxy(mut self, proxy: &str) -> Self {
self.proxy = Some(proxy.to_string());
self
}
pub fn timeout(mut self, timeout: u64) -> Self {
self.timeout = Some(timeout);
self
}
#[cfg(feature = "blocking")]
pub fn build_blocking(self) -> Result<BlockingClient, Error> {
BlockingClient::from_builder(self)
}
#[cfg(feature = "async")]
pub fn build_async(self) -> Result<AsyncClient, Error> {
AsyncClient::from_builder(self)
}
}
#[derive(Debug, Display, Error, From)]
#[display(inner)]
pub enum Error {
#[cfg(feature = "blocking")]
#[from]
#[from(ureq::Transport)]
Ureq(ureq::Error),
#[cfg(feature = "async")]
#[from]
Reqwest(reqwest::Error),
#[display(doc_comments)]
HttpResponse(u16),
#[from]
#[from(io::Error)]
Io(IoError),
#[display(doc_comments)]
NoHeader,
#[from]
Parsing(std::num::ParseIntError),
#[from]
Hex(hex::Error),
#[display(doc_comments)]
TransactionNotFound(Txid),
#[display(doc_comments)]
HeaderHeightNotFound(u32),
#[display(doc_comments)]
HeaderHashNotFound(BlockHash),
}