#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Key<'a> {
Name(&'a str),
Nth(&'a str, usize),
}
impl<'a> Key<'a> {
#[must_use]
pub fn name(&self) -> &'a str {
match *self {
Key::Name(n) | Key::Nth(n, _) => n,
}
}
}
impl<'a> From<&'a str> for Key<'a> {
fn from(name: &'a str) -> Self {
Key::Name(name)
}
}
impl<'a> From<&'a String> for Key<'a> {
fn from(name: &'a String) -> Self {
Key::Name(name)
}
}
impl<'a> From<(&'a str, usize)> for Key<'a> {
fn from((name, n): (&'a str, usize)) -> Self {
Key::Nth(name, n)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn conversions_and_name() {
let by_name: Key = "GAIN".into();
assert_eq!(by_name, Key::Name("GAIN"));
assert_eq!(by_name.name(), "GAIN");
let owned = String::from("GAIN");
let from_string: Key = (&owned).into();
assert_eq!(from_string, Key::Name("GAIN"));
let nth: Key = ("HISTORY", 2).into();
assert_eq!(nth, Key::Nth("HISTORY", 2));
assert_eq!(nth.name(), "HISTORY");
}
}