use std::fmt;
use qubit_budget::MeasuredBudgetError;
use qubit_budget::ResourceBudget;
use qubit_datatype::ConversionResource;
pub(in crate::json) struct MeasurementWriter {
budget: ResourceBudget<ConversionResource, u64>,
initial: u64,
error: Option<MeasuredBudgetError<ConversionResource, u64>>,
}
impl MeasurementWriter {
#[must_use]
#[inline]
pub(in crate::json) fn new(budget: ResourceBudget<ConversionResource, u64>) -> Self {
let initial = budget.used();
Self {
budget,
initial,
error: None,
}
}
#[inline]
pub(in crate::json) fn finish(
self,
) -> Result<u64, MeasuredBudgetError<ConversionResource, u64>> {
match self.error {
Some(error) => Err(error),
None => Ok(self.budget.used() - self.initial),
}
}
}
impl fmt::Write for MeasurementWriter {
#[inline]
fn write_str(&mut self, text: &str) -> fmt::Result {
match self.budget.try_consume_usize(text.len()) {
Ok(()) => Ok(()),
Err(error) => {
self.error = Some(error);
Err(fmt::Error)
}
}
}
}