smol-bytes 0.1.6

High-performance, clone-efficient byte buffers optimized for small data.
Documentation
use crate::INLINE_CAP;

use std::{
  boxed::Box,
  string::{String, ToString},
};

use super::*;

fn truncate_to_inline_char_boundary(s: &str) -> &str {
  let mut len = s.len().min(INLINE_CAP);
  while len > 0 && !s.is_char_boundary(len) {
    len -= 1;
  }
  &s[..len]
}

impl ::quickcheck::Arbitrary for Utf8Buffer {
  fn arbitrary(g: &mut ::quickcheck::Gen) -> Self {
    let s = String::arbitrary(g);
    Self::try_from_str(truncate_to_inline_char_boundary(&s)).unwrap_or_else(|_| Self::new())
  }

  fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
    let s = self.as_str().to_string();
    Box::new(
      s.shrink()
        .filter_map(|shrunken| Self::try_from_str(shrunken.as_str()).ok()),
    )
  }
}

#[cfg(test)]
mod tests {
  use super::*;

  #[test]
  fn truncation_does_not_split_a_multibyte_scalar_at_inline_capacity() {
    let input = std::format!("{}€", "a".repeat(INLINE_CAP - 1));
    let truncated = truncate_to_inline_char_boundary(&input);

    assert_eq!(truncated, "a".repeat(INLINE_CAP - 1));
    assert_eq!(truncated.len(), INLINE_CAP - 1);
    assert!(Utf8Buffer::try_from_str(truncated).is_ok());
  }
}