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}