use qubit_budget::ResourceQuantity;
use qubit_budget::json::JsonDecodeLimits;
use qubit_budget::json::JsonDecodeSession;
use qubit_budget::json::JsonResource;
use serde::Deserialize;
use serde::de::DeserializeOwned;
use serde::de::DeserializeSeed;
use serde_json::Value;
use super::JsonDecodeError;
use super::JsonRootKind;
use super::NormalizedJsonDocument;
use super::NormalizingJsonDecodePolicy;
use super::internal::JsonDecodeEngine;
use super::internal::JsonNormalizer;
use super::internal::TypedSeed;
#[derive(Debug)]
pub struct NormalizingJsonDecoder<'budget, R = JsonResource, Q = usize>
where
Q: ResourceQuantity,
{
normalizer: JsonNormalizer,
engine: JsonDecodeEngine<'budget, R, Q>,
}
impl<R, Q> NormalizingJsonDecoder<'static, R, Q>
where
R: Clone,
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub fn with_limits(policy: NormalizingJsonDecodePolicy, limits: JsonDecodeLimits<R, Q>) -> Self {
Self::new(policy, JsonDecodeSession::from_limits(limits))
}
}
impl<'budget, R, Q> NormalizingJsonDecoder<'budget, R, Q>
where
R: Clone,
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub const fn new(policy: NormalizingJsonDecodePolicy, session: JsonDecodeSession<'budget, R, Q>) -> Self {
Self {
normalizer: JsonNormalizer::new(policy),
engine: JsonDecodeEngine::new(session),
}
}
#[inline(always)]
#[must_use]
pub const fn session(&self) -> &JsonDecodeSession<'budget, R, Q> {
self.engine.session()
}
#[inline(always)]
#[must_use]
pub const fn session_mut(&mut self) -> &mut JsonDecodeSession<'budget, R, Q> {
self.engine.session_mut()
}
#[inline(always)]
#[must_use]
pub fn into_session(self) -> JsonDecodeSession<'budget, R, Q> {
self.engine.into_session()
}
#[inline(always)]
#[must_use]
pub const fn policy(&self) -> &NormalizingJsonDecodePolicy {
self.normalizer.policy()
}
pub fn prepare_str<'input>(
&mut self,
input: &'input str,
) -> Result<NormalizedJsonDocument<'input>, JsonDecodeError<R, Q>> {
self.engine.prepare_str(&self.normalizer, input)
}
pub fn prepare_utf8<'input>(
&mut self,
input: &'input [u8],
) -> Result<NormalizedJsonDocument<'input>, JsonDecodeError<R, Q>> {
self.engine.prepare_utf8(&self.normalizer, input)
}
pub fn decode_precharged_document<'de, T>(
&mut self,
document: &'de NormalizedJsonDocument<'_>,
) -> Result<T, JsonDecodeError<R, Q>>
where
T: Deserialize<'de>,
{
self.decode_precharged_document_seed(document, TypedSeed::new())
}
pub fn decode_precharged_document_seed<'de, S>(
&mut self,
document: &'de NormalizedJsonDocument<'_>,
seed: S,
) -> Result<S::Value, JsonDecodeError<R, Q>>
where
S: DeserializeSeed<'de>,
{
self.engine
.decode_document_seed(document, seed, self.policy().diagnostic_policy(), None)
}
pub fn decode_precharged_object_document<'de, T>(
&mut self,
document: &'de NormalizedJsonDocument<'_>,
) -> Result<T, JsonDecodeError<R, Q>>
where
T: Deserialize<'de>,
{
self.engine.decode_document_seed(
document,
TypedSeed::new(),
self.policy().diagnostic_policy(),
Some(JsonRootKind::Object),
)
}
pub fn decode_precharged_array_document<'de, T>(
&mut self,
document: &'de NormalizedJsonDocument<'_>,
) -> Result<Vec<T>, JsonDecodeError<R, Q>>
where
T: Deserialize<'de>,
{
self.engine.decode_document_seed(
document,
TypedSeed::new(),
self.policy().diagnostic_policy(),
Some(JsonRootKind::Array),
)
}
pub fn validate_precharged_document(
&mut self,
document: &NormalizedJsonDocument<'_>,
) -> Result<(), JsonDecodeError<R, Q>> {
self.engine
.validate_document(document, self.policy().diagnostic_policy(), None)
}
pub fn decode_str<T>(&mut self, input: &str) -> Result<T, JsonDecodeError<R, Q>>
where
T: DeserializeOwned,
{
let document = self.prepare_str(input)?;
self.decode_precharged_document(&document)
}
pub fn decode_utf8<T>(&mut self, input: &[u8]) -> Result<T, JsonDecodeError<R, Q>>
where
T: DeserializeOwned,
{
let document = self.prepare_utf8(input)?;
self.decode_precharged_document(&document)
}
pub fn decode_object_str<T>(&mut self, input: &str) -> Result<T, JsonDecodeError<R, Q>>
where
T: DeserializeOwned,
{
let document = self.prepare_str(input)?;
self.decode_precharged_object_document(&document)
}
pub fn decode_object_utf8<T>(&mut self, input: &[u8]) -> Result<T, JsonDecodeError<R, Q>>
where
T: DeserializeOwned,
{
let document = self.prepare_utf8(input)?;
self.decode_precharged_object_document(&document)
}
pub fn decode_array_str<T>(&mut self, input: &str) -> Result<Vec<T>, JsonDecodeError<R, Q>>
where
T: DeserializeOwned,
{
let document = self.prepare_str(input)?;
self.decode_precharged_array_document(&document)
}
pub fn decode_array_utf8<T>(&mut self, input: &[u8]) -> Result<Vec<T>, JsonDecodeError<R, Q>>
where
T: DeserializeOwned,
{
let document = self.prepare_utf8(input)?;
self.decode_precharged_array_document(&document)
}
pub fn decode_value(&mut self, input: &str) -> Result<Value, JsonDecodeError<R, Q>> {
self.decode_str(input)
}
}