indvec/
lib.rs

1#![no_std]
2
3#[doc(hidden)]
4pub extern crate alloc;
5
6#[doc(hidden)]
7#[macro_export]
8macro_rules! seq_ident {
9    ($($ident:ident),*) => {
10        {
11            let mut counter = 0usize;
12            $(
13                let $ident = counter;
14                counter += 1usize;
15            )*
16            [$($ident),*]
17        }
18    }
19}
20
21/// A [`Vec`][alloc::vec::Vec] literal that assigns item indices.
22///
23/// ```
24/// use indvec::indvec;
25///
26/// indvec![vec =
27///     a = "foo",
28///     b = "bar",
29///     _c = "qux",
30///     d = "corge",
31/// ];
32///
33/// assert_eq!(a, 0usize);
34/// assert_eq!(b, 1usize);
35/// assert_eq!(d, 3usize);
36///
37/// assert_eq!(vec[a], "foo");
38/// assert_eq!(vec[b], "bar");
39/// assert_eq!(vec[d], "corge");
40/// ```
41#[macro_export]
42macro_rules! indvec {
43    ($vec:pat = $($ident:ident = $expr:expr),* $(,)?) => {
44        #[allow(unused_assignments)]
45        let [$($ident),*] = $crate::seq_ident!($($ident),*);
46        let $vec = $crate::alloc::vec![$($expr),*];
47    }
48}