use super::JsonValueLimits;
use super::JsonValueTransaction;
use super::internal::JsonValueState;
use crate::json::JsonResource;
use crate::resource::ResourceQuantity;
#[derive(Debug, PartialEq, Eq)]
pub struct JsonValueBudget<R = JsonResource, Q = usize>
where
Q: ResourceQuantity,
{
limits: JsonValueLimits<R, Q>,
pub(super) state: JsonValueState<Q>,
}
impl<R, Q> JsonValueBudget<R, Q>
where
R: Clone,
Q: ResourceQuantity,
{
#[must_use]
pub fn transaction(&mut self) -> JsonValueTransaction<'_, R, Q> {
JsonValueTransaction::new(self)
}
#[must_use]
#[inline]
pub fn used_nodes(&self) -> Option<Q> {
self.state
.remaining_nodes()
.map(|remaining| self.limits.max_nodes().expect("configured nodes limit") - remaining)
}
#[must_use]
#[inline(always)]
pub const fn remaining_nodes(&self) -> Option<Q> {
self.state.remaining_nodes()
}
#[must_use]
#[inline]
pub fn used_payload_bytes(&self) -> Option<Q> {
self.state
.remaining_payload_bytes()
.map(|remaining| self.limits.max_payload_bytes().expect("configured payload limit") - remaining)
}
#[must_use]
#[inline(always)]
pub const fn remaining_payload_bytes(&self) -> Option<Q> {
self.state.remaining_payload_bytes()
}
}
impl<R, Q> JsonValueBudget<R, Q>
where
Q: ResourceQuantity,
{
#[inline]
#[must_use]
pub fn new(limits: JsonValueLimits<R, Q>) -> Self {
let state = JsonValueState::new(limits.max_nodes(), limits.max_payload_bytes());
Self { limits, state }
}
pub fn reset(&mut self) {
self.state = JsonValueState::new(self.limits.max_nodes(), self.limits.max_payload_bytes());
}
#[must_use]
#[inline(always)]
pub const fn limits(&self) -> &JsonValueLimits<R, Q> {
&self.limits
}
}