use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DisclosureLevel {
Beginner,
Intermediate,
Expert,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ComplexityScore {
pub value: u32,
}
impl ComplexityScore {
pub fn new(value: u32) -> Self {
Self {
value: value.min(100),
}
}
}
impl std::fmt::Display for ComplexityScore {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}/100", self.value)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct APIEndpoint {
pub name: String,
pub param_count: usize,
pub required_count: usize,
pub optional_count: usize,
pub complexity: ComplexityScore,
pub level: DisclosureLevel,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SmartDefault {
pub param_name: String,
pub default_value: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LayeredWrapper {
pub endpoint_name: String,
pub beginner_signature: Vec<String>,
pub intermediate_signature: Vec<String>,
pub expert_signature: Vec<String>,
pub smart_defaults: Vec<SmartDefault>,
pub beginner_code: String,
pub intermediate_code: String,
pub expert_code: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_complexity_score_clamped() {
let score = ComplexityScore::new(150);
assert_eq!(score.value, 100);
}
#[test]
fn test_complexity_score_display() {
let score = ComplexityScore::new(42);
assert_eq!(format!("{}", score), "42/100");
}
#[test]
fn test_disclosure_level_equality() {
assert_eq!(DisclosureLevel::Beginner, DisclosureLevel::Beginner);
assert_ne!(DisclosureLevel::Beginner, DisclosureLevel::Expert);
}
}