6 releases

0.2.5 Mar 1, 2024
0.2.4 Mar 1, 2024

#5 in #type-level

47 downloads per month

MIT/Apache

28KB
509 lines

Type-level slices of primitives.

Rust permits certain constant parameters in generics:

struct Foo<const CHAR: char>;

Presently these are limited to the primitive integers, [prim@char] and [prim@bool], so e.g slices of different chars cannot be represented.

struct Fails<const CHARS: [char]>;
type Message = Fails<['h', 'e', 'l', 'l', 'o']>;

This crate emulates the above with recursive types, and the TypeSlice trait.

type Message = typeslice::char!['h', 'e', 'l', 'l', 'o'];
// or, equivalently
type Message = typeslice::from_str!("hello");

You can inspect the message at const time or runtime through the List in TypeSlice::LIST:

use typeslice::TypeSlice;

fn get_reply<T: TypeSlice<char>>() -> &'static str {
    if T::LIST.slice_eq(&['h', 'i']) {
        return "hello"
    }
    if T::LIST.str_eq("👋👋") {
        return "😎😎"
    }
    if T::LIST.into_iter().copied().eq("salut".chars()) {
        return "bonjour"
    }
    "¿que?"
}

assert_eq!(get_reply::<typeslice::from_str!("hi")>(), "hello");

If you enjoy this crate, you may also like typenum or frunk

Dependencies

~115KB