#[cfg(feature = "json")]
use std::io::Write;
#[cfg(feature = "json")]
use qubit_budget::json::JsonDecodeLimits;
#[cfg(feature = "json")]
use qubit_budget::json::JsonDecodeSession;
#[cfg(feature = "json")]
use qubit_budget::json::JsonEncodeLimits;
#[cfg(feature = "json")]
use qubit_budget::json::JsonEncodeSession;
#[cfg(feature = "json")]
use qubit_json::decode::JsonDecoder;
#[cfg(feature = "json")]
use qubit_json::encode::JsonEncoder;
use serde::Deserialize;
use serde::Deserializer;
use serde::Serialize;
use serde::Serializer;
use serde::de::Error as DeserializeError;
use serde::ser::Error as SerializeError;
use super::multi_values::MultiValues;
use super::named_value::NamedValue;
#[cfg(feature = "json")]
use crate::ValueWireDecodeError;
#[cfg(feature = "json")]
use crate::ValueWireEncodeError;
use crate::ValueWireRefV1;
#[cfg(feature = "json")]
use crate::ValueWireV1;
mod internal;
use self::internal::NamedMultiValuesWireOwned;
use self::internal::NamedMultiValuesWireRef;
#[must_use]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct NamedMultiValues {
name: String,
value: MultiValues,
}
impl NamedMultiValues {
#[inline(always)]
pub fn new(name: impl Into<String>, value: MultiValues) -> Self {
Self {
name: name.into(),
value,
}
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn decode_json_slice(input: &[u8]) -> Result<Self, ValueWireDecodeError> {
Self::decode_json_slice_with_limits(input, ValueWireV1::default_json_decode_limits())
}
#[cfg(feature = "json")]
pub fn decode_json_slice_with_limits(input: &[u8], limits: JsonDecodeLimits) -> Result<Self, ValueWireDecodeError> {
let session = JsonDecodeSession::from_limits(limits);
JsonDecoder::new(session)
.decode_utf8(input)
.map_err(ValueWireDecodeError::from)
}
#[cfg(feature = "json")]
#[inline(always)]
pub fn to_json_vec(&self) -> Result<Vec<u8>, ValueWireEncodeError> {
self.to_json_vec_with_limits(ValueWireV1::default_json_encode_limits())
}
#[cfg(feature = "json")]
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, ValueWireV1::default_json_encode_limits())
}
#[cfg(feature = "json")]
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)
}
#[inline(always)]
#[must_use = "the borrowed name should be used"]
pub fn name(&self) -> &str {
&self.name
}
#[inline(always)]
pub fn set_name(&mut self, name: impl Into<String>) {
self.name = name.into();
}
#[inline(always)]
#[must_use = "the borrowed values should be used"]
pub fn values(&self) -> &MultiValues {
&self.value
}
#[inline(always)]
#[must_use = "the mutable values reference should be used"]
pub fn values_mut(&mut self) -> &mut MultiValues {
&mut self.value
}
#[inline(always)]
pub fn set_values(&mut self, values: MultiValues) {
self.value = values;
}
#[inline(always)]
#[must_use = "consuming NamedMultiValues without using its parts loses both fields"]
pub fn into_parts(self) -> (String, MultiValues) {
(self.name, self.value)
}
#[must_use = "the projected named value should be used"]
#[inline(always)]
pub fn first_named_value(&self) -> NamedValue {
NamedValue::new(self.name.as_str(), self.value.first_value())
}
#[inline]
pub fn into_first_named_value(self) -> NamedValue {
let (name, values) = self.into_parts();
NamedValue::new(name, values.into_first_value())
}
}
impl From<NamedValue> for NamedMultiValues {
#[inline]
fn from(named: NamedValue) -> Self {
let (name, value) = named.into_parts();
let value = MultiValues::from(value);
Self { name, value }
}
}
impl Serialize for NamedMultiValues {
#[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let value = ValueWireRefV1::try_from(self.values()).map_err(SerializeError::custom)?;
NamedMultiValuesWireRef {
name: self.name(),
value,
}
.serialize(serializer)
}
}
impl<'de> Deserialize<'de> for NamedMultiValues {
#[inline]
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let NamedMultiValuesWireOwned { name, value } = NamedMultiValuesWireOwned::deserialize(deserializer)?;
let value = value
.into_container()
.into_collection()
.map_err(|_| DeserializeError::custom("named multi-values wire payload must contain a collection"))?;
Ok(Self::new(name, value))
}
}