use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ProviderCapabilities {
pub supports_webhooks: bool,
pub supports_real_time_updates: bool,
pub supports_batch_operations: bool,
pub rate_limit_per_second: u32,
pub pagination_max_size: u32,
pub requires_authentication: bool,
pub supports_cursor_pagination: bool,
pub supports_filtering: bool,
pub supports_sorting: bool,
}
impl Default for ProviderCapabilities {
fn default() -> Self {
Self {
supports_webhooks: false,
supports_real_time_updates: false,
supports_batch_operations: false,
rate_limit_per_second: 10,
pagination_max_size: 50,
requires_authentication: true,
supports_cursor_pagination: false,
supports_filtering: false,
supports_sorting: false,
}
}
}
impl ProviderCapabilities {
pub fn meets_rate_limit(&self, min_rate: u32) -> bool {
self.rate_limit_per_second == 0 || self.rate_limit_per_second >= min_rate
}
pub fn meets_pagination_size(&self, min_size: u32) -> bool {
self.pagination_max_size >= min_size
}
pub fn recommended_page_size(&self) -> u32 {
if self.pagination_max_size > 0 {
self.pagination_max_size
} else {
50
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_capabilities() {
let caps = ProviderCapabilities::default();
assert!(!caps.supports_webhooks);
assert!(!caps.supports_real_time_updates);
assert_eq!(caps.rate_limit_per_second, 10);
assert_eq!(caps.pagination_max_size, 50);
assert!(caps.requires_authentication);
}
#[test]
fn test_meets_rate_limit() {
let caps = ProviderCapabilities {
rate_limit_per_second: 100,
..Default::default()
};
assert!(caps.meets_rate_limit(50));
assert!(caps.meets_rate_limit(100));
assert!(!caps.meets_rate_limit(150));
}
#[test]
fn test_meets_rate_limit_unlimited() {
let caps = ProviderCapabilities {
rate_limit_per_second: 0, ..Default::default()
};
assert!(caps.meets_rate_limit(1000));
assert!(caps.meets_rate_limit(10000));
}
#[test]
fn test_meets_pagination_size() {
let caps = ProviderCapabilities {
pagination_max_size: 100,
..Default::default()
};
assert!(caps.meets_pagination_size(50));
assert!(caps.meets_pagination_size(100));
assert!(!caps.meets_pagination_size(150));
}
#[test]
fn test_recommended_page_size() {
let caps = ProviderCapabilities {
pagination_max_size: 100,
..Default::default()
};
assert_eq!(caps.recommended_page_size(), 100);
let caps_zero = ProviderCapabilities {
pagination_max_size: 0,
..Default::default()
};
assert_eq!(caps_zero.recommended_page_size(), 50);
}
}