use crate::json::JsonMeasurement;
use crate::json::JsonValueTransaction;
use crate::resource::MeasuredBudgetError;
use crate::resource::ResourceBudget;
use crate::resource::ResourceQuantity;
pub struct JsonEncodeAttempt<'a, R, Q>
where
Q: ResourceQuantity,
{
output: Option<&'a mut ResourceBudget<R, Q>>,
value: JsonValueTransaction<'a, R, Q>,
}
impl<'a, R, Q> JsonEncodeAttempt<'a, R, Q>
where
R: Clone,
Q: ResourceQuantity,
{
#[inline(always)]
#[must_use = "the output-byte check result must be handled"]
pub(crate) const fn new(
output: Option<&'a mut ResourceBudget<R, Q>>,
value: JsonValueTransaction<'a, R, Q>,
) -> Self {
Self { output, value }
}
#[inline]
#[must_use = "the output-byte check result must be handled"]
pub fn check_output_bytes(&self, amount: usize) -> Result<(), MeasuredBudgetError<R, Q>> {
match self.output.as_deref() {
Some(budget) => budget.check_available_usize(amount),
None => Ok(()),
}
}
#[inline]
pub fn try_consume_output_bytes(&mut self, amount: usize) -> Result<(), MeasuredBudgetError<R, Q>> {
match self.output.as_deref_mut() {
Some(budget) => budget.try_consume_usize(amount),
None => Ok(()),
}
}
#[inline]
pub fn try_admit(&mut self, measurement: JsonMeasurement) -> Result<(), MeasuredBudgetError<R, Q>> {
self.value.try_admit(measurement)
}
#[must_use]
#[inline(always)]
pub fn output_budget(&self) -> Option<&ResourceBudget<R, Q>> {
self.output.as_deref()
}
#[must_use]
#[inline]
pub fn split_mut(&mut self) -> (Option<&mut ResourceBudget<R, Q>>, &mut JsonValueTransaction<'a, R, Q>) {
(self.output.as_deref_mut(), &mut self.value)
}
#[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) -> Result<(), MeasuredBudgetError<R, Q>> {
self.value.commit()
}
}