use super::AccessGrant;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct QuotaUsage {
pub storage_bytes: i64,
pub charged_seats: i64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ReadonlyReason {
MemberOverflow,
StorageOverflow,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct WorkspaceQuotaState {
pub seat_limit: i32,
pub storage_quota: i64,
pub overcapacity_member_count: i64,
pub readonly_reasons: Vec<ReadonlyReason>,
}
pub fn evaluate_workspace_quota(grant: &AccessGrant, usage: QuotaUsage) -> WorkspaceQuotaState {
let overcapacity_member_count = (usage.charged_seats - i64::from(grant.limits.seat_limit)).max(0);
let mut readonly_reasons = Vec::with_capacity(2);
if overcapacity_member_count > 0 {
readonly_reasons.push(ReadonlyReason::MemberOverflow);
}
if usage.storage_bytes > grant.limits.storage_quota {
readonly_reasons.push(ReadonlyReason::StorageOverflow);
}
WorkspaceQuotaState {
seat_limit: grant.limits.seat_limit,
storage_quota: grant.limits.storage_quota,
overcapacity_member_count,
readonly_reasons,
}
}
#[cfg(test)]
#[path = "../tests/access_control/quota/tests.rs"]
mod tests;