use crate::account::{PrivateKey, Signature, ViewKey};
use crate::types::native::AddressNative;
use core::{convert::TryFrom, fmt, ops::Deref, str::FromStr};
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct Address(AddressNative);
#[wasm_bindgen]
impl Address {
pub fn from_private_key(private_key: &PrivateKey) -> Self {
Self(AddressNative::try_from(**private_key).unwrap())
}
pub fn from_view_key(view_key: &ViewKey) -> Self {
Self(AddressNative::try_from(**view_key).unwrap())
}
pub fn from_string(address: &str) -> Self {
Self::from_str(address).unwrap()
}
#[allow(clippy::inherent_to_string_shadow_display)]
pub fn to_string(&self) -> String {
self.0.to_string()
}
pub fn verify(&self, message: &[u8], signature: &Signature) -> bool {
signature.verify(self, message)
}
}
impl FromStr for Address {
type Err = anyhow::Error;
fn from_str(address: &str) -> Result<Self, Self::Err> {
Ok(Self(AddressNative::from_str(address)?))
}
}
impl From<AddressNative> for Address {
fn from(value: AddressNative) -> Self {
Self(value)
}
}
impl fmt::Display for Address {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl Deref for Address {
type Target = AddressNative;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::account::PrivateKey;
use wasm_bindgen_test::*;
const ITERATIONS: u64 = 1_000;
#[wasm_bindgen_test]
pub fn test_from_private_key() {
for _ in 0..ITERATIONS {
let private_key = PrivateKey::new();
let expected = Address::from_private_key(&private_key);
let view_key = private_key.to_view_key();
assert_eq!(expected, Address::from_view_key(&view_key));
}
}
}