affine_core 0.0.2

AFFiNE primitive core.
Documentation
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;