use alloc::string::{String, ToString};
pub trait SafelyIndex<Node = Self> {
fn get(&self, key: impl Into<Accessor>) -> Option<&Node>;
}
pub trait SafelyIndexMut<Node = Self> {
fn get_mut(&mut self, key: impl Into<Accessor>) -> Option<&mut Node>;
}
pub enum Accessor {
Field(String),
Index(usize),
}
impl From<usize> for Accessor {
fn from(val: usize) -> Self {
Accessor::Index(val)
}
}
impl From<String> for Accessor {
fn from(val: String) -> Self {
Accessor::Field(val)
}
}
impl From<&str> for Accessor {
fn from(val: &str) -> Self {
Accessor::Field(val.to_string())
}
}
impl<Node: SafelyIndex> SafelyIndex<Node> for Option<Node> {
fn get(&self, key: impl Into<Accessor>) -> Option<&Node> {
self.as_ref().and_then(|data| data.get(key))
}
}
impl<Node: SafelyIndexMut> SafelyIndexMut<Node> for Option<Node> {
fn get_mut(&mut self, key: impl Into<Accessor>) -> Option<&mut Node> {
self.as_mut().and_then(|data| data.get_mut(key))
}
}
impl<Node: SafelyIndex> SafelyIndex<Node> for Option<&Node> {
fn get(&self, key: impl Into<Accessor>) -> Option<&Node> {
self.as_ref().and_then(|data| data.get(key))
}
}
impl<Node: SafelyIndexMut> SafelyIndexMut<Node> for Option<&mut Node> {
fn get_mut(&mut self, key: impl Into<Accessor>) -> Option<&mut Node> {
self.as_mut().and_then(|data| data.get_mut(key))
}
}