use serde::{
Serialize,
Serializer,
};
use crate::{
MultiValues,
Value,
ValueContainer,
};
use super::{
ValueWireEncodeError,
ValueWirePayloadRefV1,
serialize_wire,
};
#[must_use]
pub struct ValueWireRefV1<'a> {
value: ValueWirePayloadRefV1<'a>,
}
impl<'a> ValueWireRefV1<'a> {
pub fn from_value(value: &'a Value) -> Result<Self, ValueWireEncodeError> {
ValueWirePayloadRefV1::from_value(value).map(Self::new)
}
pub fn from_values(
values: &'a MultiValues,
) -> Result<Self, ValueWireEncodeError> {
ValueWirePayloadRefV1::from_values(values).map(Self::new)
}
pub fn from_container(
value: &'a ValueContainer,
) -> Result<Self, ValueWireEncodeError> {
ValueWirePayloadRefV1::from_container(value).map(Self::new)
}
pub const fn new(value: ValueWirePayloadRefV1<'a>) -> Self {
Self { value }
}
}
impl<'a> TryFrom<&'a Value> for ValueWireRefV1<'a> {
type Error = ValueWireEncodeError;
fn try_from(value: &'a Value) -> Result<Self, Self::Error> {
Self::from_value(value)
}
}
impl<'a> TryFrom<&'a MultiValues> for ValueWireRefV1<'a> {
type Error = ValueWireEncodeError;
fn try_from(values: &'a MultiValues) -> Result<Self, Self::Error> {
Self::from_values(values)
}
}
impl<'a> TryFrom<&'a ValueContainer> for ValueWireRefV1<'a> {
type Error = ValueWireEncodeError;
fn try_from(value: &'a ValueContainer) -> Result<Self, Self::Error> {
Self::from_container(value)
}
}
impl Serialize for ValueWireRefV1<'_> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serialize_wire(self.value.shape(), serializer)
}
}