mod base58;
mod base58_errors;
mod cashaddr;
mod cashaddr_errors;
mod earth;
mod earth_errors;
mod errors;
pub use base58::Base58Codec;
pub use base58_errors::Base58Error;
pub use cashaddr::CashAddrCodec;
pub use cashaddr_errors::CashAddrError;
pub use earth::EarthCodec;
pub use earth_errors::EarthError;
pub use errors::*;
#[derive(PartialEq, Clone, Debug)]
pub enum Network {
Main,
Test,
Regtest,
}
#[derive(PartialEq, Clone, Debug)]
pub enum Scheme {
Base58,
CashAddr,
Earth,
}
#[derive(PartialEq, Clone, Debug)]
pub enum HashType {
Key,
Script,
Account,
}
#[derive(PartialEq, Clone, Debug)]
pub struct Address {
pub body: Vec<u8>,
pub scheme: Scheme,
pub hash_type: HashType,
pub network: Network,
}
impl Default for Address {
fn default() -> Self {
Address {
body: vec![],
scheme: Scheme::Earth,
hash_type: HashType::Key,
network: Network::Main,
}
}
}
impl<'a> AsRef<[u8]> for Address {
fn as_ref(&self) -> &[u8] {
&self.body
}
}
impl Address {
pub fn new(body: Vec<u8>, scheme: Scheme, hash_type: HashType, network: Network) -> Self {
Address {
body,
scheme,
hash_type,
network,
}
}
pub fn into_body(self) -> Vec<u8> {
self.body
}
pub fn encode(&self) -> Result<String, AddressError> {
match self.scheme {
Scheme::CashAddr => CashAddrCodec::encode(
&self.body,
self.hash_type.to_owned(),
self.network.to_owned(),
)
.map_err(AddressError::CashAddr),
Scheme::Earth => EarthCodec::encode(
&self.body,
self.hash_type.to_owned(),
self.network.to_owned(),
)
.map_err(AddressError::Earth),
Scheme::Base58 => Base58Codec::encode(
&self.body,
self.hash_type.to_owned(),
self.network.to_owned(),
)
.map_err(AddressError::Base58),
}
}
pub fn decode(addr_str: &str) -> Result<Self, (CashAddrError, EarthError, Base58Error)> {
CashAddrCodec::decode(addr_str).or_else(|cash_err| {
EarthCodec::decode(addr_str).or_else(|earth_err| {
Base58Codec::decode(addr_str)
.map_err(|base58_err| (cash_err, earth_err, base58_err))
})
})
}
}
pub trait AddressCodec {
type Error;
fn encode(raw: &[u8], hash_type: HashType, network: Network) -> Result<String, Self::Error>;
fn decode(s: &str) -> Result<Address, Self::Error>;
}