#![warn(missing_docs)]
extern crate byteorder;
use std::io;
pub use amf0::Value as Amf0Value;
pub use amf3::Value as Amf3Value;
pub mod amf0;
pub mod amf3;
pub mod error;
pub type DecodeResult<T> = Result<T, error::DecodeError>;
#[derive(Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash)]
pub enum Version {
Amf0,
Amf3,
}
#[derive(Debug, Clone, PartialEq, PartialOrd)]
pub enum Value {
Amf0(Amf0Value),
Amf3(Amf3Value),
}
impl Value {
pub fn read_from<R>(reader: R, version: Version) -> DecodeResult<Self>
where
R: io::Read,
{
match version {
Version::Amf0 => Amf0Value::read_from(reader).map(Value::Amf0),
Version::Amf3 => Amf3Value::read_from(reader).map(Value::Amf3),
}
}
pub fn write_to<W>(&self, writer: W) -> io::Result<()>
where
W: io::Write,
{
match *self {
Value::Amf0(ref x) => x.write_to(writer),
Value::Amf3(ref x) => x.write_to(writer),
}
}
pub fn try_as_str(&self) -> Option<&str> {
match *self {
Value::Amf0(ref x) => x.try_as_str(),
Value::Amf3(ref x) => x.try_as_str(),
}
}
pub fn try_as_f64(&self) -> Option<f64> {
match *self {
Value::Amf0(ref x) => x.try_as_f64(),
Value::Amf3(ref x) => x.try_as_f64(),
}
}
pub fn try_into_values(self) -> Result<Box<dyn Iterator<Item = Value>>, Self> {
match self {
Value::Amf0(x) => x.try_into_values().map_err(Value::Amf0),
Value::Amf3(x) => x
.try_into_values()
.map(|iter| iter.map(Value::Amf3))
.map(iter_boxed)
.map_err(Value::Amf3),
}
}
pub fn try_into_pairs(self) -> Result<Box<dyn Iterator<Item = (String, Value)>>, Self> {
match self {
Value::Amf0(x) => x.try_into_pairs().map_err(Value::Amf0),
Value::Amf3(x) => x
.try_into_pairs()
.map(|iter| iter.map(|(k, v)| (k, Value::Amf3(v))))
.map(iter_boxed)
.map_err(Value::Amf3),
}
}
}
impl From<Amf0Value> for Value {
fn from(f: Amf0Value) -> Value {
Value::Amf0(f)
}
}
impl From<Amf3Value> for Value {
fn from(f: Amf3Value) -> Value {
Value::Amf3(f)
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Pair<K, V> {
pub key: K,
pub value: V,
}
fn iter_boxed<I, T>(iter: I) -> Box<dyn Iterator<Item = T>>
where
I: Iterator<Item = T> + 'static,
{
Box::new(iter)
}