openalias-ruby/src/lib.rs

61 lines
2.4 KiB
Rust

#[macro_use]
extern crate ruru;
extern crate openalias;
use ruru::{Array, Hash, Class, Boolean, Object, RString, Symbol};
class!(Openalias);
methods!(
Openalias,
_itself,
fn addresses(address: RString) -> Array {
let mut cryptoaddresses = Array::new();
match openalias::addresses(&address.unwrap().to_string()) {
Ok(cas) => {
for c in cas {
let mut cryptoaddress = Hash::new();
cryptoaddress.store(Symbol::new("cryptocurrency"), RString::new(&c.cryptocurrency));
cryptoaddress.store(Symbol::new("address"), RString::new(&c.address));
if let Some(recipient_name) = c.recipient_name.as_ref() {
cryptoaddress.store(Symbol::new("recipient_name"), RString::new(recipient_name));
}
if let Some(tx_description) = c.tx_description.as_ref() {
cryptoaddress.store(Symbol::new("tx_description"), RString::new(tx_description));
}
if let Some(tx_amount) = c.tx_amount.as_ref() {
cryptoaddress.store(Symbol::new("tx_amount"), RString::new(tx_amount));
}
if let Some(tx_payment_id) = c.tx_payment_id.as_ref() {
cryptoaddress.store(Symbol::new("tx_payment_id"), RString::new(tx_payment_id));
}
if let Some(address_signature) = c.address_signature.as_ref() {
cryptoaddress.store(Symbol::new("address_signature"), RString::new(address_signature));
}
if let Some(&(_, checksum_ok)) = c.checksum.as_ref() {
cryptoaddress.store(Symbol::new("checksum"), Boolean::new(checksum_ok));
}
for (key, val) in &c.additional_values {
cryptoaddress.store(Symbol::new(key), RString::new(val));
}
let ca = Class::from_existing("Openalias").get_nested_class("CryptoAddress").new_instance(vec![cryptoaddress.to_any_object()]);
cryptoaddresses.push(ca);
}
return cryptoaddresses;
}
Err(_cas) => {
return cryptoaddresses;
}
}
}
);
#[no_mangle]
pub extern fn init_openalias_rust() {
Class::from_existing("Openalias").define(|itself| {
itself.def_self("addresses", addresses);
});
}