stringlet/
traits.rs

1//! Many implementations to make Stringlet easy to use.
2
3use crate::*;
4
5use core::hash::{Hash, Hasher};
6
7impl_for! {
8    From<String>:
9
10    fn from(str: String) -> Self {
11        Self::from(str.as_str())
12    }
13}
14
15impl_for! {
16    From<&str>:
17
18    fn from(str: &str) -> Self {
19        assert!(
20            Self::fits(str.len()),
21            "{}::from(): cannot store {} characters",
22            Self::type_name().join(""),
23            str.len()
24        );
25        // SAFETY we checked the length and str is UTF-8
26        unsafe { Self::from_utf8_unchecked(str.as_bytes()) }
27    }
28}
29
30impl_for! {
31    std::str::FromStr:
32
33    type Err = std::convert::Infallible;
34
35    fn from_str(s: &str) -> Result<Self, Self::Err> {
36        Ok(Self::from(s))
37    }
38}
39
40impl_for! {
41    Hash:
42
43    fn hash<H: Hasher>(&self, state: &mut H) {
44        self.str.hash(state);
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[test]
53    fn test_from_string() {
54        let s: SlimStringlet<4> = String::from("hey").into();
55        assert_eq!(s.as_ref(), "hey");
56    }
57
58    #[test]
59    fn test_from_long_str() {
60        let s: VarStringlet<16> = "Rustacean".into();
61        assert_eq!(&s, "Rustacean");
62    }
63
64    #[test]
65    #[should_panic]
66    fn test_panics_when_too_long() {
67        let _s: VarStringlet<2> = "hello world".into();
68    }
69
70    #[test]
71    fn test_from_str() {
72        let s = SlimStringlet::<8>::from("hello");
73        assert_eq!(s.as_ref(), "hello");
74    }
75}