valu3/types/
value_key.rs

1use crate::prelude::*;
2
3pub trait ValueTrait {}
4
5#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
6pub enum ValueKey {
7    String(StringB),
8    Number(usize),
9}
10
11impl ValueKey {
12    pub fn as_string_b(&self) -> StringB {
13        match self {
14            ValueKey::String(s) => s.clone(),
15            ValueKey::Number(n) => StringB::from(n.to_string()),
16        }
17    }
18
19    pub fn to_usize(&self) -> usize {
20        match self {
21            ValueKey::String(s) => panic!("Cannot convert string to usize: {}", s),
22            ValueKey::Number(n) => *n,
23        }
24    }
25
26    pub fn len(&self) -> usize {
27        match self {
28            ValueKey::String(s) => s.len(),
29            ValueKey::Number(n) => n.to_string().len(),
30        }
31    }
32}
33
34impl Display for ValueKey {
35    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
36        match self {
37            ValueKey::String(s) => write!(f, "{}", s),
38            ValueKey::Number(n) => write!(f, "{}", n),
39        }
40    }
41}
42
43impl From<String> for ValueKey {
44    fn from(s: String) -> Self {
45        ValueKey::String(StringB::from(s))
46    }
47}
48
49impl From<&str> for ValueKey {
50    fn from(s: &str) -> Self {
51        ValueKey::String(StringB::from(s))
52    }
53}
54
55impl From<u32> for ValueKey {
56    fn from(n: u32) -> Self {
57        ValueKey::Number(n as usize)
58    }
59}
60
61use std::{
62    fmt::{Display, Formatter},
63    iter::FromIterator,
64};
65
66impl<'a> FromIterator<&'a ValueKey> for ValueKey {
67    fn from_iter<I: IntoIterator<Item = &'a ValueKey>>(iter: I) -> Self {
68        let mut iterator = iter.into_iter();
69        match iterator.next() {
70            Some(ValueKey::String(s)) => ValueKey::String(s.clone()),
71            Some(ValueKey::Number(n)) => ValueKey::Number(*n),
72            None => ValueKey::String(StringB::default()),
73        }
74    }
75}