use crate::algebra::{ResourceDimension, ResourceVector};
use crate::wire::{RecordAdmissionEnvelope, RecordTooLarge};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct RecordSizePermit {
encoded_record_charge: ResourceVector,
}
impl RecordSizePermit {
#[must_use]
pub const fn encoded_record_charge(self) -> ResourceVector {
self.encoded_record_charge
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum RecordSizeDecision {
Eligible(RecordSizePermit),
Respond(RecordTooLarge),
}
#[must_use]
pub const fn check_record_size(
request: RecordAdmissionEnvelope,
encoded_record_charge: ResourceVector,
max_ordinary_record_charge: ResourceVector,
) -> RecordSizeDecision {
if encoded_record_charge.entries > max_ordinary_record_charge.entries {
return RecordSizeDecision::Respond(RecordTooLarge {
request,
dimension: ResourceDimension::Entries,
encoded_record_charge,
max_ordinary_record_charge,
});
}
if encoded_record_charge.bytes > max_ordinary_record_charge.bytes {
return RecordSizeDecision::Respond(RecordTooLarge {
request,
dimension: ResourceDimension::Bytes,
encoded_record_charge,
max_ordinary_record_charge,
});
}
RecordSizeDecision::Eligible(RecordSizePermit {
encoded_record_charge,
})
}