use crate::json::JsonMeasurement;
use crate::json::JsonValueTransaction;
use crate::resource::MeasuredBudgetError;
use crate::resource::ResourceBudget;
use crate::resource::ResourceQuantity;
pub struct JsonDecodeAttempt<'a, R, Q>
where
Q: ResourceQuantity,
{
input: Option<&'a mut ResourceBudget<R, Q>>,
normalized_input: Option<&'a mut ResourceBudget<R, Q>>,
value: JsonValueTransaction<'a, R, Q>,
}
impl<'a, R, Q> JsonDecodeAttempt<'a, R, Q>
where
R: Clone,
Q: ResourceQuantity,
{
#[inline(always)]
#[must_use]
pub(crate) const fn new(
input: Option<&'a mut ResourceBudget<R, Q>>,
normalized_input: Option<&'a mut ResourceBudget<R, Q>>,
value: JsonValueTransaction<'a, R, Q>,
) -> Self {
Self {
input,
normalized_input,
value,
}
}
#[inline]
pub fn try_consume_input_bytes(&mut self, amount: usize) -> Result<(), MeasuredBudgetError<R, Q>> {
consume_bytes(self.input.as_deref_mut(), amount)
}
#[inline]
pub fn try_consume_normalized_input_bytes(&mut self, amount: usize) -> Result<(), MeasuredBudgetError<R, Q>> {
consume_bytes(self.normalized_input.as_deref_mut(), amount)
}
#[inline]
pub fn try_admit(&mut self, measurement: JsonMeasurement) -> Result<(), MeasuredBudgetError<R, Q>> {
self.value.try_admit(measurement)
}
#[must_use]
#[inline(always)]
pub fn input_budget(&self) -> Option<&ResourceBudget<R, Q>> {
self.input.as_deref()
}
#[must_use]
#[inline(always)]
pub fn normalized_input_budget(&self) -> Option<&ResourceBudget<R, Q>> {
self.normalized_input.as_deref()
}
#[must_use]
#[inline]
pub fn used_nodes(&self) -> Option<Q> {
self.value.used_nodes()
}
#[must_use]
#[inline(always)]
pub const fn remaining_nodes(&self) -> Option<Q> {
self.value.remaining_nodes()
}
#[must_use]
#[inline]
pub fn used_payload_bytes(&self) -> Option<Q> {
self.value.used_payload_bytes()
}
#[must_use]
#[inline(always)]
pub const fn remaining_payload_bytes(&self) -> Option<Q> {
self.value.remaining_payload_bytes()
}
#[must_use]
#[inline]
pub fn value_transaction_mut(&mut self) -> &mut JsonValueTransaction<'a, R, Q> {
&mut self.value
}
pub fn commit(self) {
self.value.commit();
}
}
#[inline]
fn consume_bytes<R, Q>(
budget: Option<&mut ResourceBudget<R, Q>>,
amount: usize,
) -> Result<(), MeasuredBudgetError<R, Q>>
where
R: Clone,
Q: ResourceQuantity,
{
match budget {
Some(budget) => budget.try_consume_usize(amount),
None => Ok(()),
}
}