xpring 0.0.10

Rust client-side library for the XRP Ledger
Documentation
use crate::address;
use crate::address::XClassicAddress;
use crate::javascript::JavaScript;
use fehler::throws;
use std::str;
use anyhow::Error;

// Address

#[throws(_)]
pub fn is_valid_address(jscontext: &mut JavaScript, address: &str) -> bool {
    address::is_valid_address(jscontext, address)?
}

#[throws(_)]
pub fn encode_classic_address(
    jscontext: &mut JavaScript,
    classic_address: &str,
    tag: Option<u16>,
    test: Option<bool>,
) -> String {
    address::encode_classic_address(jscontext, classic_address, tag, test)?
}

#[throws(_)]
pub fn decode_x_address(jscontext: &mut JavaScript, x_address: &str) -> XClassicAddress {
    address::decode_x_address(jscontext, x_address)?
}

#[throws(_)]
pub fn is_valid_x_address(jscontext: &mut JavaScript, x_address: &str) -> bool {
    address::is_valid_x_address(jscontext, x_address)?
}

#[throws(_)]
pub fn is_valid_classic_address(jscontext: &mut JavaScript, address: &str) -> bool {
    address::is_valid_classic_address(jscontext, address)?
}

#[cfg(test)]
mod tests {

    use super::*;
    use fehler::throws;

    #[throws(_)]
    #[test]
    fn test_valid_classic_address() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_address(&mut jscontext, "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1").unwrap(),
            true
        );
    }

    #[throws(_)]
    #[test]
    fn test_valid_x_address() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_address(
                &mut jscontext,
                "XVLhHMPHU98es4dbozjVtdWzVrDjtV18pX8yuPT7y4xaEHi"
            )
            .unwrap(),
            true
        );
    }

    #[throws(_)]
    #[test]
    fn test_address_wrong_alphabet() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_address(&mut jscontext, "1EAG1MwmzkG6gRZcYqcRMfC17eMt8TDTit").unwrap(),
            false
        );
    }

    #[throws(_)]
    #[test]
    fn test_classic_address_wrong_checksum() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_address(&mut jscontext, "rU6K7V3Po4sBBBBBaU29sesqs2qTQJWDw1").unwrap(),
            false
        );
    }

    #[throws(_)]
    #[test]
    fn test_x_address_wrong_checksum() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_address(
                &mut jscontext,
                "XVLhHMPHU98es4dbozjVtdWzVrDjtV18pX8yuPT7y4xaEHI"
            )
            .unwrap(),
            false
        );
    }

    #[throws(_)]
    #[test]
    fn test_address_invalid_character() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_address(&mut jscontext, "rU6K7V3Po4sBBBBBaU@#$%qs2qTQJWDw1").unwrap(),
            false
        );
    }

    #[throws(_)]
    #[test]
    fn test_address_invalid_too_long() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_address(
                &mut jscontext,
                "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1"
            )
            .unwrap(),
            false
        );
    }

    #[throws(_)]
    #[test]
    fn test_address_invalid_too_short() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_address(&mut jscontext, "rU6K7V3Po4s2qTQJWDw1").unwrap(),
            false
        );
    }

    #[throws(_)]
    #[test]
    fn test_encode_x_address_mainnet_and_tag() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            encode_classic_address(
                &mut jscontext,
                "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1",
                Some(12345),
                None
            )
            .unwrap(),
            "XVfC9CTCJh6GN2x8bnrw3LtdbqiVCUvtU3HnooQDgBnUpQT".to_owned()
        );
    }

    #[throws(_)]
    #[test]
    fn test_encode_x_address_testnet_and_tag() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            encode_classic_address(
                &mut jscontext,
                "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1",
                Some(12345),
                None
            )
            .unwrap(),
            "XVfC9CTCJh6GN2x8bnrw3LtdbqiVCUvtU3HnooQDgBnUpQT".to_owned()
        );
    }

    #[throws(_)]
    #[test]
    fn test_encode_x_address_only() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            encode_classic_address(
                &mut jscontext,
                "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1",
                None,
                Some(false)
            )
            .unwrap(),
            "XVfC9CTCJh6GN2x8bnrw3LtdbqiVCUFyQVMzRrMGUZpokKH".to_owned()
        );
    }

    #[throws(_)]
    #[test]
    fn test_encode_x_address_invalid_address() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        let x_address =
            encode_classic_address(&mut jscontext, "xrp", None, Some(false)).unwrap_err();
        assert_eq!(
            "Invalid Parameters",
            x_address.downcast_ref::<String>().unwrap()
        );
    }

    #[throws(_)]
    #[test]
    fn test_decode_x_address_valid_mainnet_with_tag() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        let expected = XClassicAddress {
            address: "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1".to_owned(),
            tag: Some(12345),
            test: false,
        };
        assert_eq!(
            decode_x_address(
                &mut jscontext,
                "XVfC9CTCJh6GN2x8bnrw3LtdbqiVCUvtU3HnooQDgBnUpQT"
            )
            .unwrap(),
            expected
        );
    }

    #[throws(_)]
    #[test]
    fn test_decode_x_address_valid_testnet_with_tag() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        let expected = XClassicAddress {
            address: "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1".to_owned(),
            tag: Some(12345),
            test: true,
        };
        assert_eq!(
            decode_x_address(
                &mut jscontext,
                "TVsBZmcewpEHgajPi1jApLeYnHPJw82v9JNYf7dkGmWphmh"
            )
            .unwrap(),
            expected
        );
    }

    #[throws(_)]
    #[test]
    fn test_decode_x_address_valid_testnet_without_tag() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        let expected = XClassicAddress {
            address: "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1".to_owned(),
            tag: None,
            test: false,
        };
        assert_eq!(
            decode_x_address(
                &mut jscontext,
                "XVfC9CTCJh6GN2x8bnrw3LtdbqiVCUFyQVMzRrMGUZpokKH"
            )
            .unwrap(),
            expected
        );
    }

    #[throws(_)]
    #[test]
    fn test_decode_x_address_invalid_address() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        let x_address = decode_x_address(&mut jscontext, "xrp").unwrap_err();
        assert_eq!(
            "Invalid Address",
            x_address.downcast_ref::<String>().unwrap()
        );
    }

    #[throws(_)]
    #[test]
    fn test_is_valid_x_address_with_classic_address() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_x_address(&mut jscontext, "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1").unwrap(),
            false
        );
    }

    #[throws(_)]
    #[test]
    fn test_is_valid_x_address_with_invalid_address() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(is_valid_x_address(&mut jscontext, "xrp").unwrap(), false);
    }

    #[throws(_)]
    #[test]
    fn test_is_valid_x_address_with_valid_x_address() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_x_address(
                &mut jscontext,
                "XVfC9CTCJh6GN2x8bnrw3LtdbqiVCUvtU3HnooQDgBnUpQT"
            )
            .unwrap(),
            true
        );
    }

    #[throws(_)]
    #[test]
    fn test_is_valid_classic_address_with_valid_classic_address() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_classic_address(&mut jscontext, "rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1").unwrap(),
            true
        );
    }

    #[throws(_)]
    #[test]
    fn test_is_valid_classic_address_with_invalid_classic_address() {
        let out_dir = std::env::var("OUT_DIR").unwrap();
        let mut jscontext = JavaScript::new(format!("{}/xpring.js", out_dir))?;
        assert_eq!(
            is_valid_classic_address(&mut jscontext, "xrp").unwrap(),
            false
        );
    }
}