#string #fixed-length #stack-allocated

no-std fstr

A stack-allocated fixed-length string type

17 releases

0.2.12 Oct 13, 2024
0.2.10 Nov 20, 2023
0.2.4 Jul 10, 2023
0.1.6 Mar 30, 2023
0.1.1 Nov 23, 2022

#227 in Encoding

Download history 1845/week @ 2024-08-23 1949/week @ 2024-08-30 1413/week @ 2024-09-06 934/week @ 2024-09-13 1700/week @ 2024-09-20 1640/week @ 2024-09-27 1539/week @ 2024-10-04 1996/week @ 2024-10-11 1953/week @ 2024-10-18 1665/week @ 2024-10-25 1856/week @ 2024-11-01 2064/week @ 2024-11-08 1318/week @ 2024-11-15 1773/week @ 2024-11-22 1909/week @ 2024-11-29 1895/week @ 2024-12-06

7,194 downloads per month
Used in 13 crates (5 directly)

Apache-2.0

41KB
622 lines

FStr: a stack-allocated fixed-length string type

Crates.io License

This crate provides a thin wrapper for [u8; N] to handle a stack-allocated byte array as a fixed-length, String-like owned type through common traits including Display, PartialEq, and Deref<Target = str>.

use fstr::FStr;

let x = FStr::try_from(b"foo")?;
println!("{}", x); // "foo"
assert_eq!(x, "foo");
assert_eq!(&x[..], "foo");
assert_eq!(&x as &str, "foo");
assert!(!x.is_empty());
assert!(x.is_ascii());

let mut y = FStr::try_from(b"bar")?;
assert_eq!(y, "bar");
y.make_ascii_uppercase();
assert_eq!(y, "BAR");

const K: FStr<8> = FStr::from_str_unwrap("constant");
assert_eq!(K, "constant");

Unlike String and arrayvec::ArrayString, this type has the same binary representation as the underlying [u8; N] and manages fixed-length strings only. The type parameter takes the exact length (in bytes) of a concrete type, and each concrete type only holds the string values of that size.

let s = "Lorem Ipsum ✨";
assert_eq!(s.len(), 15);
assert!(s.parse::<FStr<15>>().is_ok()); // just right
assert!(s.parse::<FStr<10>>().is_err()); // too small
assert!(s.parse::<FStr<20>>().is_err()); // too large
let x: FStr<10> = FStr::from_str_unwrap("helloworld");
let y: FStr<12> = FStr::from_str_unwrap("helloworld  ");

// This code does not compile because `FStr` of different lengths cannot mix.
if x != y {
    unreachable!();
}

Variable-length string operations are partially supported by utilizing a C-style NUL-terminated buffer and some helper methods.

let mut buffer = FStr::<24>::from_fmt(format_args!("&#x{:x};", b'@'), b'\0')?;
assert_eq!(buffer, "&#x40;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");

let c_str = buffer.slice_to_terminator('\0');
assert_eq!(c_str, "&#x40;");

use core::fmt::Write as _;
write!(buffer.writer_at(c_str.len()), " COMMERCIAL AT")?;
assert_eq!(buffer.slice_to_terminator('\0'), "&#x40; COMMERCIAL AT");

Crate features

  • std (optional; enabled by default) enables the integration with std. Disable default features to operate this crate under no_std environments.
  • serde (optional) enables the serialization and deserialization of FStrthrough serde.

License

Licensed under the Apache License, Version 2.0.

See also

Dependencies

~160KB