use crate::value::Value;
#[cfg(feature = "serialization")]
use serde::Serialize;
use std::convert::From;
pub struct Bin<'a> {
pub name: &'a str,
pub value: Value,
}
impl<'a> Bin<'a> {
pub const fn new(name: &'a str, val: Value) -> Self {
Bin { name, value: val }
}
}
impl<'a> AsRef<Bin<'a>> for Bin<'a> {
fn as_ref(&self) -> &Self {
self
}
}
#[macro_export]
macro_rules! as_bin {
($bin_name:expr, None) => {{
$crate::Bin::new($bin_name, $crate::Value::Nil)
}};
($bin_name:expr, $val:expr) => {{
$crate::Bin::new($bin_name, $crate::Value::from($val))
}};
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serialization", derive(Serialize))]
pub enum Bins {
All,
None,
Some(Vec<String>),
}
impl Bins {
pub const fn is_all(&self) -> bool {
matches!(*self, Bins::All)
}
pub const fn is_none(&self) -> bool {
matches!(*self, Bins::None)
}
}
impl<'a> From<&'a [&'a str]> for Bins {
fn from(bins: &'a [&'a str]) -> Self {
let bins = bins.iter().cloned().map(String::from).collect();
Bins::Some(bins)
}
}
impl<'a> From<[&'a str; 1]> for Bins {
fn from(bins: [&'a str; 1]) -> Self {
let bins = bins.iter().cloned().map(String::from).collect();
Bins::Some(bins)
}
}
impl<'a> From<[&'a str; 2]> for Bins {
fn from(bins: [&'a str; 2]) -> Self {
let bins = bins.iter().cloned().map(String::from).collect();
Bins::Some(bins)
}
}
impl<'a> From<[&'a str; 3]> for Bins {
fn from(bins: [&'a str; 3]) -> Self {
let bins = bins.iter().cloned().map(String::from).collect();
Bins::Some(bins)
}
}
impl<'a> From<[&'a str; 4]> for Bins {
fn from(bins: [&'a str; 4]) -> Self {
let bins = bins.iter().cloned().map(String::from).collect();
Bins::Some(bins)
}
}
impl<'a> From<[&'a str; 5]> for Bins {
fn from(bins: [&'a str; 5]) -> Self {
let bins = bins.iter().cloned().map(String::from).collect();
Bins::Some(bins)
}
}
impl<'a> From<[&'a str; 6]> for Bins {
fn from(bins: [&'a str; 6]) -> Self {
let bins = bins.iter().cloned().map(String::from).collect();
Bins::Some(bins)
}
}
#[cfg(test)]
mod tests {
use super::{Bins, From};
#[test]
fn into_bins() {
let bin_names = vec!["a".to_string(), "b".to_string(), "c".to_string()];
let expected = Bins::Some(bin_names);
assert_eq!(expected, Bins::from(["a", "b", "c"]));
}
}