radiate-utils 1.3.1

A Rust library for genetic algorithms and artificial evolution.
Documentation
use crate::AnyValue;
use radiate_error::RadiateError;

impl<'a> TryFrom<AnyValue<'a>> for f32 {
    type Error = RadiateError;

    fn try_from(value: AnyValue<'a>) -> Result<Self, Self::Error> {
        match value {
            AnyValue::Float32(v) => Ok(v),
            AnyValue::Float64(v) => Ok(v as f32),
            AnyValue::Int8(v) => Ok(v as f32),
            AnyValue::Int16(v) => Ok(v as f32),
            AnyValue::Int32(v) => Ok(v as f32),
            AnyValue::Int64(v) => Ok(v as f32),
            AnyValue::UInt8(v) => Ok(v as f32),
            AnyValue::UInt16(v) => Ok(v as f32),
            AnyValue::UInt32(v) => Ok(v as f32),
            AnyValue::UInt64(v) => Ok(v as f32),
            AnyValue::Bool(v) => Ok(if v { 1.0 } else { 0.0 }),
            AnyValue::Usize(v) => Ok(v as f32),
            AnyValue::Duration(v) => Ok(v.as_secs_f32()),
            _ => Err(RadiateError::AnyValue(format!(
                "Expected Float32, found {:?}",
                value.dtype()
            ))),
        }
    }
}

impl<'a> TryFrom<AnyValue<'a>> for String {
    type Error = RadiateError;

    fn try_from(value: AnyValue<'a>) -> Result<Self, Self::Error> {
        match value {
            AnyValue::StrOwned(v) => Ok(v.to_string()),
            AnyValue::Str(v) => Ok(v.to_string()),
            _ => Err(RadiateError::AnyValue(format!(
                "Expected String, found {:?}",
                value.dtype()
            ))),
        }
    }
}

impl<'a, T> TryFrom<AnyValue<'a>> for Vec<T>
where
    T: TryFrom<AnyValue<'a>, Error = RadiateError>,
{
    type Error = RadiateError;

    fn try_from(value: AnyValue<'a>) -> Result<Self, Self::Error> {
        match value {
            AnyValue::Vector(v) => v
                .into_iter()
                .map(|v| T::try_from(v))
                .collect::<Result<Vec<T>, RadiateError>>(),
            AnyValue::Slice(slice) => slice
                .iter()
                .map(|v| T::try_from(v.clone()))
                .collect::<Result<Vec<T>, RadiateError>>(),
            _ => Err(RadiateError::AnyValue(format!(
                "Expected Vector, found {:?}",
                value.dtype()
            ))),
        }
    }
}