use qubit_budget::ResourceQuantity;
use qubit_budget::json::JsonDecodeLimits;
use qubit_budget::json::JsonDecodeSession;
use qubit_budget::json::JsonResource;
use qubit_io::Input;
use super::DiagnosticPolicy;
use super::JcsDecodeError;
use super::internal::JsonDecodeEngine;
use crate::value::SafeJsonValue;
#[derive(Debug)]
pub struct JcsDecoder<'budget, R = JsonResource, Q = usize>
where
Q: ResourceQuantity,
{
diagnostic_policy: DiagnosticPolicy,
engine: JsonDecodeEngine<'budget, R, Q>,
}
impl<R, Q> JcsDecoder<'static, R, Q>
where
R: Clone,
Q: ResourceQuantity,
{
#[must_use]
#[inline]
pub fn with_limits(limits: JsonDecodeLimits<R, Q>) -> Self {
Self::new(JsonDecodeSession::from_limits(limits))
}
}
impl JcsDecoder<'static, JsonResource, usize> {
#[must_use]
#[inline]
pub fn unlimited() -> Self {
Self::with_limits(JsonDecodeLimits::new())
}
}
impl<'budget, R, Q> JcsDecoder<'budget, R, Q>
where
R: Clone,
Q: ResourceQuantity,
{
#[must_use]
#[inline]
pub const fn new(session: JsonDecodeSession<'budget, R, Q>) -> Self {
Self {
diagnostic_policy: DiagnosticPolicy::Redacted,
engine: JsonDecodeEngine::new(session),
}
}
#[must_use]
#[inline]
pub const fn with_diagnostic_policy(mut self, policy: DiagnosticPolicy) -> Self {
self.diagnostic_policy = policy;
self
}
#[must_use]
#[inline]
pub const fn diagnostic_policy(&self) -> DiagnosticPolicy {
self.diagnostic_policy
}
#[must_use]
#[inline]
pub const fn session(&self) -> &JsonDecodeSession<'budget, R, Q> {
self.engine.session()
}
#[must_use]
#[inline]
pub const fn session_mut(&mut self) -> &mut JsonDecodeSession<'budget, R, Q> {
self.engine.session_mut()
}
#[must_use]
#[inline]
pub fn into_session(self) -> JsonDecodeSession<'budget, R, Q> {
self.engine.into_session()
}
#[inline]
pub fn decode_str(&mut self, input: &str) -> Result<serde_json::Value, JcsDecodeError<R, Q>> {
self.decode_utf8(input.as_bytes())
}
pub fn decode_value_str(&mut self, input: &str) -> Result<SafeJsonValue, JcsDecodeError<R, Q>> {
self.decode_value_utf8(input.as_bytes())
}
pub fn decode_value_utf8(
&mut self,
input: &[u8],
) -> Result<SafeJsonValue, JcsDecodeError<R, Q>> {
self.engine.decode_jcs_utf8(input, self.diagnostic_policy)
}
pub fn decode_utf8(&mut self, input: &[u8]) -> Result<serde_json::Value, JcsDecodeError<R, Q>> {
self.decode_value_utf8(input).map(SafeJsonValue::into_value)
}
pub fn decode_value_input<I>(
&mut self,
input: &mut I,
) -> Result<SafeJsonValue, JcsDecodeError<R, Q>>
where
I: Input<Item = u8> + ?Sized,
{
self.engine.decode_jcs_input(input, self.diagnostic_policy)
}
pub fn decode_input<I>(
&mut self,
input: &mut I,
) -> Result<serde_json::Value, JcsDecodeError<R, Q>>
where
I: Input<Item = u8> + ?Sized,
{
self.decode_value_input(input)
.map(SafeJsonValue::into_value)
}
}