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::DeserializeSeed;
use super::DiagnosticPolicy;
use super::JsonDecodeError;
use super::JsonRootKind;
use super::internal::JsonDecodeEngine;
use super::internal::TypedSeed;
#[derive(Debug)]
pub struct JsonDecoder<'budget, R = JsonResource, Q = usize>
where
Q: ResourceQuantity,
{
diagnostic_policy: DiagnosticPolicy,
engine: JsonDecodeEngine<'budget, R, Q>,
}
impl<R, Q> JsonDecoder<'static, R, Q>
where
R: Clone,
Q: ResourceQuantity,
{
#[inline(always)]
#[must_use]
pub fn with_limits(limits: JsonDecodeLimits<R, Q>) -> Self {
Self::new(JsonDecodeSession::from_limits(limits))
}
}
impl JsonDecoder<'static, JsonResource, usize> {
#[inline(always)]
#[must_use]
pub fn unlimited() -> Self {
Self::with_limits(JsonDecodeLimits::new())
}
}
impl<'budget, R, Q> JsonDecoder<'budget, R, Q>
where
R: Clone,
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub const fn new(session: JsonDecodeSession<'budget, R, Q>) -> Self {
Self {
diagnostic_policy: DiagnosticPolicy::Redacted,
engine: JsonDecodeEngine::new(session),
}
}
#[inline(always)]
#[must_use]
pub const fn with_diagnostic_policy(mut self, policy: DiagnosticPolicy) -> Self {
self.diagnostic_policy = policy;
self
}
#[inline(always)]
#[must_use]
pub const fn diagnostic_policy(&self) -> DiagnosticPolicy {
self.diagnostic_policy
}
#[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()
}
pub fn decode_str<'de, T>(&mut self, input: &'de str) -> Result<T, JsonDecodeError<R, Q>>
where
T: Deserialize<'de>,
{
self.decode_seed_str(TypedSeed::new(), input)
}
pub fn decode_utf8<'de, T>(&mut self, input: &'de [u8]) -> Result<T, JsonDecodeError<R, Q>>
where
T: Deserialize<'de>,
{
self.decode_seed_utf8(TypedSeed::new(), input)
}
pub fn decode_seed_str<'de, S>(&mut self, seed: S, input: &'de str) -> Result<S::Value, JsonDecodeError<R, Q>>
where
S: DeserializeSeed<'de>,
{
self.decode_seed_utf8(seed, input.as_bytes())
}
pub fn decode_seed_utf8<'de, S>(&mut self, seed: S, input: &'de [u8]) -> Result<S::Value, JsonDecodeError<R, Q>>
where
S: DeserializeSeed<'de>,
{
self.engine.decode_seed_utf8(seed, input, self.diagnostic_policy)
}
pub fn decode_object_str<'de, T>(&mut self, input: &'de str) -> Result<T, JsonDecodeError<R, Q>>
where
T: Deserialize<'de>,
{
self.decode_object_utf8(input.as_bytes())
}
pub fn decode_object_utf8<'de, T>(&mut self, input: &'de [u8]) -> Result<T, JsonDecodeError<R, Q>>
where
T: Deserialize<'de>,
{
self.engine.decode_seed_utf8_with_top_level(
TypedSeed::new(),
input,
self.diagnostic_policy,
Some(JsonRootKind::Object),
)
}
pub fn decode_array_str<'de, T>(&mut self, input: &'de str) -> Result<Vec<T>, JsonDecodeError<R, Q>>
where
T: Deserialize<'de>,
{
self.decode_array_utf8(input.as_bytes())
}
pub fn decode_array_utf8<'de, T>(&mut self, input: &'de [u8]) -> Result<Vec<T>, JsonDecodeError<R, Q>>
where
T: Deserialize<'de>,
{
self.engine.decode_seed_utf8_with_top_level(
TypedSeed::new(),
input,
self.diagnostic_policy,
Some(JsonRootKind::Array),
)
}
pub fn validate_str(&mut self, input: &str) -> Result<(), JsonDecodeError<R, Q>> {
self.validate_utf8(input.as_bytes())
}
pub fn validate_utf8(&mut self, input: &[u8]) -> Result<(), JsonDecodeError<R, Q>> {
self.engine.validate_utf8(input, self.diagnostic_policy)
}
}