use crate::error::Result;
use async_trait::async_trait;
#[async_trait]
pub trait SeatChecker: Send + Sync {
async fn has_seat_available(&self, org_id: &str, current_count: u32) -> Result<bool>;
async fn get_seat_limit(&self, org_id: &str) -> Result<Option<u32>>;
}
#[derive(Clone, Copy, Debug, Default)]
pub struct UnlimitedSeats;
impl UnlimitedSeats {
#[must_use]
pub fn new() -> Self {
Self
}
}
#[async_trait]
impl SeatChecker for UnlimitedSeats {
async fn has_seat_available(&self, _org_id: &str, _current_count: u32) -> Result<bool> {
Ok(true)
}
async fn get_seat_limit(&self, _org_id: &str) -> Result<Option<u32>> {
Ok(None)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_unlimited_seats() {
let checker = UnlimitedSeats::new();
assert!(checker.has_seat_available("org_1", 0).await.unwrap());
assert!(checker.has_seat_available("org_1", 100).await.unwrap());
assert!(checker.has_seat_available("org_1", 10000).await.unwrap());
assert_eq!(checker.get_seat_limit("org_1").await.unwrap(), None);
}
}