#[cfg(feature = "json")]
use serde::Deserialize;
#[cfg(feature = "json")]
use serde::Serialize;
#[cfg(feature = "json")]
use serde::de::DeserializeSeed;
#[cfg(feature = "json")]
use serde_json::Value;
use super::conversion_session::ConversionSession;
use super::conversion_string_writer::ConversionStringWriter;
use super::error::DataConversionError;
use super::options::ConversionLimits;
use super::options::ConversionPolicy;
use crate::datatype::DataType;
#[must_use]
pub(crate) struct ConversionContext<'session, 'policy> {
session: &'session mut ConversionSession<'policy>,
from: DataType,
to: DataType,
}
impl<'session, 'policy> ConversionContext<'session, 'policy> {
#[inline(always)]
pub(crate) fn new(session: &'session mut ConversionSession<'policy>, from: DataType, to: DataType) -> Self {
Self { session, from, to }
}
#[inline(always)]
pub const fn policy(&self) -> &'policy ConversionPolicy {
self.session.policy()
}
#[inline(always)]
pub const fn limits(&self) -> &'policy ConversionLimits {
self.session.limits()
}
#[inline(always)]
pub(crate) const fn source_type(&self) -> DataType {
self.from
}
#[inline(always)]
pub const fn to_type(&self) -> DataType {
self.to
}
#[cfg(feature = "json")]
#[inline]
pub fn decode_json<'de, T>(&mut self, input: &'de [u8]) -> Result<T, DataConversionError>
where
T: Deserialize<'de>,
{
self.session.decode_json(self.from, self.to, input)
}
#[cfg(feature = "json")]
#[inline]
pub fn decode_json_seed<'de, S>(&mut self, seed: S, input: &'de [u8]) -> Result<S::Value, DataConversionError>
where
S: DeserializeSeed<'de>,
{
self.session.decode_json_seed(self.from, self.to, seed, input)
}
#[cfg(feature = "json")]
#[inline]
pub fn account_json_value(&mut self, value: &Value) -> Result<(), DataConversionError> {
self.session.account_json_value(self.from, self.to, value)
}
#[cfg(feature = "json")]
#[inline]
pub fn encode_json<T>(&mut self, value: &T) -> Result<Vec<u8>, DataConversionError>
where
T: Serialize + ?Sized,
{
self.session.encode_json(self.from, self.to, value)
}
#[inline]
pub fn write_string<F>(&mut self, render: F) -> Result<String, DataConversionError>
where
F: FnOnce(&mut ConversionStringWriter<'_>) -> Result<(), DataConversionError>,
{
self.session.write_string(self.from, self.to, render)
}
#[inline]
pub(crate) fn admit_output_bytes(&mut self, amount: usize) -> Result<(), DataConversionError> {
self.session.admit_output_bytes(self.from, self.to, amount)
}
}