hipstr 0.8.0

Yet another string for Rust: zero-cost borrow and slicing, inline representation for small strings, (atomic) reference counting
Documentation
use alloc::string::String;
use alloc::vec::Vec;

use super::*;
use crate::{HipByt, HipStr as H};

#[test]
fn test_borsh() {
    let s = H::from("123");
    let mut buf = Vec::new();
    s.serialize(&mut buf).unwrap();
    let s = H::deserialize(&mut buf.as_slice()).unwrap();
    assert_eq!(s, "123");

    let a = "a".repeat(42);
    let s = H::from(a.as_str());
    let mut buf = Vec::new();
    s.serialize(&mut buf).unwrap();
    let s = H::deserialize(&mut buf.as_slice()).unwrap();
    assert_eq!(s, a);

    let s = H::new();
    let mut buf = Vec::new();
    s.serialize(&mut buf).unwrap();
    let s = H::deserialize(&mut buf.as_slice()).unwrap();
    assert_eq!(s, "");
}

#[test]
fn test_compat_borsh() {
    let s = "123";
    let mut buf = Vec::new();
    s.serialize(&mut buf).unwrap();
    let s = H::deserialize(&mut buf.as_slice()).unwrap();
    assert_eq!(s, "123");

    let s = H::from("123");
    let mut buf = Vec::new();
    s.serialize(&mut buf).unwrap();
    let s = String::deserialize(&mut buf.as_slice()).unwrap();
    assert_eq!(s, "123");
}

#[test]
fn test_bad_borsh() {
    let s = H::from("123");
    let mut buf = Vec::new();
    s.serialize(&mut buf).unwrap();

    let payload_short = H::deserialize(&mut &buf[..buf.len() - 1]);
    assert!(payload_short.is_err());

    let size_short = H::deserialize(&mut &buf[..2]);
    assert!(size_short.is_err());

    let v: &[u8] = b"abc\xFFc";
    let mut buf = Vec::new();
    v.serialize(&mut buf).unwrap();
    let s = HipByt::deserialize(&mut buf.as_slice()).unwrap();
    assert_eq!(s, v);

    let s = H::deserialize(&mut buf.as_slice());
    let err = s.unwrap_err();
    let kind = err.kind();
    assert_eq!(kind, ErrorKind::InvalidData);
    assert_eq!(
        err.get_ref().unwrap(),
        "invalid utf-8 sequence of 1 bytes from index 3"
    );
}