Crates.io | fstr |
lib.rs | fstr |
version | 0.2.12 |
source | src |
created_at | 2022-11-23 11:32:56.681415 |
updated_at | 2024-10-13 13:07:08.580424 |
description | A stack-allocated fixed-length string type |
homepage | |
repository | https://github.com/LiosK/fstr-rs |
max_upload_size | |
id | 721552 |
size | 51,924 |
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, "@\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, "@");
use core::fmt::Write as _;
write!(buffer.writer_at(c_str.len()), " COMMERCIAL AT")?;
assert_eq!(buffer.slice_to_terminator('\0'), "@ COMMERCIAL AT");
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 FStr
through serde
.Licensed under the Apache License, Version 2.0.