#[cfg(feature = "json")]
use std::io::Write;
#[cfg(feature = "json")]
use qubit_budget::json::JsonEncodeLimits;
#[cfg(feature = "json")]
use qubit_budget::json::JsonEncodeSession;
#[cfg(feature = "json")]
use qubit_json::encode::JsonEncoder;
use serde::Serialize;
use serde::Serializer;
use super::ValueWireEncodeError;
use super::ValueWirePayloadRefV1;
use super::serialize_wire;
use crate::MultiValues;
use crate::Value;
use crate::ValueContainer;
#[must_use]
pub struct ValueWireRefV1<'a> {
value: ValueWirePayloadRefV1<'a>,
}
impl<'a> ValueWireRefV1<'a> {
#[inline(always)]
pub fn from_value(value: &'a Value) -> Result<Self, ValueWireEncodeError> {
ValueWirePayloadRefV1::from_value(value).map(Self::new)
}
#[inline(always)]
pub fn from_values(values: &'a MultiValues) -> Result<Self, ValueWireEncodeError> {
ValueWirePayloadRefV1::from_values(values).map(Self::new)
}
#[inline(always)]
pub fn from_container(value: &'a ValueContainer) -> Result<Self, ValueWireEncodeError> {
ValueWirePayloadRefV1::from_container(value).map(Self::new)
}
#[inline(always)]
pub const fn new(value: ValueWirePayloadRefV1<'a>) -> Self {
Self { value }
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn to_json_vec(&self) -> Result<Vec<u8>, ValueWireEncodeError> {
self.to_json_vec_with_limits(super::default_json_encode_limits())
}
#[cfg(feature = "json")]
#[inline]
pub fn to_json_vec_with_limits(&self, limits: JsonEncodeLimits) -> Result<Vec<u8>, ValueWireEncodeError> {
let session = JsonEncodeSession::from_limits(limits);
JsonEncoder::new(session)
.to_vec(self)
.map_err(ValueWireEncodeError::from)
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn to_json_writer<W>(&self, writer: W) -> Result<(), ValueWireEncodeError>
where
W: Write,
{
self.to_json_writer_with_limits(writer, super::default_json_encode_limits())
}
#[cfg(feature = "json")]
#[inline]
pub fn to_json_writer_with_limits<W>(&self, writer: W, limits: JsonEncodeLimits) -> Result<(), ValueWireEncodeError>
where
W: Write,
{
let session = JsonEncodeSession::from_limits(limits);
JsonEncoder::new(session)
.write_buffered(writer, self)
.map_err(ValueWireEncodeError::from)
}
}
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)
}
}