use qubit_budget::MeasuredBudgetError;
use qubit_budget::ResourceQuantity;
use qubit_budget::json::JsonResource;
use qubit_budget::json::JsonValueBudget;
use qubit_budget::json::JsonValueLimits;
use serde_json::Value;
use super::JsonTreeReader;
pub struct JsonTreeBudgetTracker<R = JsonResource, Q = usize>
where
Q: ResourceQuantity,
{
budget: JsonValueBudget<R, Q>,
}
impl<R, Q> JsonTreeBudgetTracker<R, Q>
where
R: Clone,
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub fn new(limits: JsonValueLimits<R, Q>) -> Self {
Self {
budget: JsonValueBudget::new(limits),
}
}
pub fn account(&mut self, value: &Value) -> Result<(), MeasuredBudgetError<R, Q>> {
let mut transaction = self.budget.transaction();
let result = JsonTreeReader::new(&mut transaction).account(value);
match result {
Ok(()) => transaction.commit(),
Err(error) => Err(error),
}
}
#[inline(always)]
pub fn reset(&mut self) {
self.budget.reset();
}
#[must_use]
#[inline(always)]
pub const fn budget(&self) -> &JsonValueBudget<R, Q> {
&self.budget
}
#[must_use]
#[inline(always)]
pub fn budget_mut(&mut self) -> &mut JsonValueBudget<R, Q> {
&mut self.budget
}
#[must_use]
#[inline(always)]
pub fn into_budget(self) -> JsonValueBudget<R, Q> {
self.budget
}
}