mod inner;
use {
core::ops::RangeTo,
self::inner::Inner,
};
#[derive(Debug)]
pub struct ObjectIndexes<'a, const N: usize> {
inner: Inner<'a, N>,
}
impl<const N: usize> ObjectIndexes<'_, N> {
pub (crate) fn iter(&self) -> impl Iterator<Item=&str> {
let result = match &self.inner {
Inner::Slice(slice) => slice.iter(),
Inner::Array(array) => array.iter(),
};
result.map(|s| *s)
}
pub (crate) fn len(&self) -> usize {
match &self.inner {
Inner::Slice(slice) => slice.len(),
Inner::Array(array) => array.len(),
}
}
pub (crate) fn index_with_range_to(&self, range: RangeTo<usize>) -> &[&str] {
&self.inner[range]
}
}
impl<'a> From<&'a str> for ObjectIndexes<'a, 1> {
fn from(key: &'a str) -> Self {
Self {
inner: Inner::Array([key]),
}
}
}
impl<'a, const N: usize> From<[&'a str; N]> for ObjectIndexes<'a, N> {
fn from(keys: [&'a str; N]) -> Self {
Self {
inner: Inner::Array(keys),
}
}
}
impl<'a> From<&'a [&'a str]> for ObjectIndexes<'a, 0> {
fn from(keys: &'a [&'a str]) -> Self {
Self {
inner: Inner::Slice(keys),
}
}
}