flowly-flv 0.1.1

FLV format streaming parser
Documentation
use std::fmt;

use crate::{error::Error, tag::meta::MetaDataValue};

pub mod meta;

impl MetaDataValue {
    #[cold]
    fn invalid_type<E>(&self, exp: &dyn serde::de::Expected) -> E
    where
        E: serde::de::Error,
    {
        serde::de::Error::invalid_type(self.unexpected(), exp)
    }

    #[cold]
    fn unexpected(&self) -> serde::de::Unexpected {
        use serde::de::Unexpected;
        match self {
            MetaDataValue::Null => Unexpected::Unit,
            MetaDataValue::Boolean(b) => Unexpected::Bool(*b),
            MetaDataValue::Number(n) => Unexpected::Float(*n),
            MetaDataValue::String(s) => Unexpected::Str(unsafe { str::from_utf8_unchecked(s) }),
            MetaDataValue::StrictArray(_) => Unexpected::Seq,
            MetaDataValue::Object(_) => Unexpected::Map,
            MetaDataValue::MovieClip => Unexpected::Other("movie"),
            MetaDataValue::Undefined => Unexpected::Other("undefined"),
            MetaDataValue::Reference(_) => todo!(),
            MetaDataValue::ECMAArray(_) => Unexpected::Map,
            MetaDataValue::Date(_) => Unexpected::Other("date"),
            MetaDataValue::LongString(s) => Unexpected::Str(unsafe { str::from_utf8_unchecked(s) }),
            MetaDataValue::Unknown(_) => Unexpected::Other("unknown"),
        }
    }
}

struct MetaDataUnexpected<'a>(serde::de::Unexpected<'a>);

impl<'a> fmt::Display for MetaDataUnexpected<'a> {
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        match self.0 {
            serde::de::Unexpected::Unit => formatter.write_str("null"),

            unexp => fmt::Display::fmt(&unexp, formatter),
        }
    }
}

impl serde::de::Error for Error {
    #[cold]
    fn custom<T: fmt::Display>(msg: T) -> Error {
        Error::ParseMetaError(msg.to_string())
    }

    #[cold]
    fn invalid_type(unexp: serde::de::Unexpected, exp: &dyn serde::de::Expected) -> Self {
        Error::ParseMetaError(format!(
            "invalid type: {}, expected {}",
            MetaDataUnexpected(unexp),
            exp,
        ))
    }

    #[cold]
    fn invalid_value(unexp: serde::de::Unexpected, exp: &dyn serde::de::Expected) -> Self {
        Error::ParseMetaError(format!(
            "invalid value: {}, expected {}",
            MetaDataUnexpected(unexp),
            exp,
        ))
    }
}