stellar-xdr 30.0.0

Stellar XDR types, encoding, and decoding.
Documentation
#![cfg(all(feature = "std", feature = "base64"))]

use crate::Error;
use crate::{Limited, Limits, ReadXdr, WriteXdr};
use base64::Engine;
use std::assert_eq;
use std::io::Cursor;

#[test]
fn test_skip_whitespace() -> Result<(), Error> {
    let v_bytes = [1u32.to_xdr(Limits::none())?, 2u32.to_xdr(Limits::none())?].concat();

    let v_base64 = base64::engine::general_purpose::STANDARD.encode(&v_bytes);
    assert_eq!(v_base64.len(), 12);
    assert_eq!(v_base64, "AAAAAQAAAAI=");

    let v_base64 = " AA\nAAAQ A  AAAI= ";

    {
        assert_eq!(
            u32::read_xdr_base64_to_end(&mut Limited::new(Cursor::new(&v_base64), Limits::none())),
            Err(Error::Invalid)
        );
        assert_eq!(
            u64::read_xdr_base64_to_end(&mut Limited::new(Cursor::new(&v_base64), Limits::none())),
            Ok((1u64 << 32) | 2u64)
        );
    }

    {
        assert_eq!(
            u32::from_xdr_base64(v_base64, Limits::none()),
            Err(Error::Invalid)
        );
        assert_eq!(
            u64::from_xdr_base64(v_base64, Limits::none()),
            Ok((1u64 << 32) | 2u64)
        );
    }

    {
        let mut r = Limited::new(Cursor::new(&v_base64), Limits::none());
        let mut iter = u32::read_xdr_base64_iter(&mut r);
        assert_eq!(iter.next(), Some(Ok(1)),);
        assert_eq!(iter.next(), Some(Ok(2)),);
        assert_eq!(iter.next(), None,);
    }

    Ok(())
}