use std::fmt;
use qubit_budget::MeasuredBudgetError;
use qubit_budget::ResourceBudget;
use qubit_datatype::ConversionResource;
pub(super) struct MeasurementWriter {
budget: ResourceBudget<ConversionResource, u64>,
initial: u64,
error: Option<MeasuredBudgetError<ConversionResource, u64>>,
}
impl MeasurementWriter {
pub(super) fn new(budget: ResourceBudget<ConversionResource, u64>) -> Self {
let initial = budget.used();
Self {
budget,
initial,
error: None,
}
}
pub(super) 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 {
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)
}
}
}
}