valu3 0.9.6

A generic serialization/deserialization/type framework
Documentation
use crate::prelude::*;

pub trait ValueTrait {}

#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum ValueKey {
    String(StringB),
    Number(usize),
}

impl ValueKey {
    pub fn as_string_b(&self) -> StringB {
        match self {
            ValueKey::String(s) => s.clone(),
            ValueKey::Number(n) => StringB::from(n.to_string()),
        }
    }

    pub fn to_usize(&self) -> usize {
        match self {
            ValueKey::String(s) => panic!("Cannot convert string to usize: {}", s),
            ValueKey::Number(n) => *n,
        }
    }

    pub fn len(&self) -> usize {
        match self {
            ValueKey::String(s) => s.len(),
            ValueKey::Number(n) => n.to_string().len(),
        }
    }
}

impl Display for ValueKey {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        match self {
            ValueKey::String(s) => write!(f, "{}", s),
            ValueKey::Number(n) => write!(f, "{}", n),
        }
    }
}

impl From<String> for ValueKey {
    fn from(s: String) -> Self {
        ValueKey::String(StringB::from(s))
    }
}

impl From<&str> for ValueKey {
    fn from(s: &str) -> Self {
        ValueKey::String(StringB::from(s))
    }
}

impl From<u32> for ValueKey {
    fn from(n: u32) -> Self {
        ValueKey::Number(n as usize)
    }
}

use std::{
    fmt::{Display, Formatter},
    iter::FromIterator,
};

impl<'a> FromIterator<&'a ValueKey> for ValueKey {
    fn from_iter<I: IntoIterator<Item = &'a ValueKey>>(iter: I) -> Self {
        let mut iterator = iter.into_iter();
        match iterator.next() {
            Some(ValueKey::String(s)) => ValueKey::String(s.clone()),
            Some(ValueKey::Number(n)) => ValueKey::Number(*n),
            None => ValueKey::String(StringB::default()),
        }
    }
}