Aufgaben-Python/courses/rust/09_traits_und_shared_behavior/musterloesung.rs

132 lines
3.1 KiB
Rust

// ============================================================================
// 🦀 RUST 09: TRAITS & SHARED BEHAVIOR (MUSTERLÖSUNG)
// ============================================================================
#[derive(Debug, Clone, PartialEq)]
pub struct CpuMetric {
pub core_id: usize,
pub usage_percent: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DiskAlert {
pub device: String,
pub free_space_gb: u32,
pub critical_override: Option<bool>,
}
pub trait TelemetryReport {
fn summary(&self) -> String;
fn severity_level(&self) -> u8 {
1
}
fn is_critical(&self) -> bool {
self.severity_level() >= 8
}
}
pub trait FormatJson {
fn to_json(&self) -> String;
}
impl TelemetryReport for CpuMetric {
fn summary(&self) -> String {
format!("CPU[{}]: {:.1}%", self.core_id, self.usage_percent)
}
fn severity_level(&self) -> u8 {
if self.usage_percent >= 90.0 {
9
} else if self.usage_percent >= 75.0 {
5
} else {
1
}
}
}
impl FormatJson for CpuMetric {
fn to_json(&self) -> String {
format!(
r#"{{"type":"cpu","core_id":{},"usage_percent":{:.1}}}"#,
self.core_id, self.usage_percent
)
}
}
impl TelemetryReport for DiskAlert {
fn summary(&self) -> String {
format!("Disk[{}]: {} GB free", self.device, self.free_space_gb)
}
fn severity_level(&self) -> u8 {
if self.free_space_gb < 5 {
10
} else if self.free_space_gb < 20 {
6
} else {
2
}
}
fn is_critical(&self) -> bool {
if let Some(c) = self.critical_override {
c
} else {
self.severity_level() >= 8
}
}
}
impl FormatJson for DiskAlert {
fn to_json(&self) -> String {
format!(
r#"{{"type":"disk","device":"{}","free_space_gb":{}}}"#,
self.device, self.free_space_gb
)
}
}
pub fn format_and_dispatch<T: TelemetryReport + FormatJson>(item: &T) -> String {
format!("[SEV {}] JSON: {}", item.severity_level(), item.to_json())
}
pub fn filter_critical<'a, T: TelemetryReport>(items: &'a [T]) -> Vec<&'a T> {
items.iter().filter(|item| item.is_critical()).collect()
}
pub fn create_default_reporter() -> impl TelemetryReport {
CpuMetric {
core_id: 0,
usage_percent: 0.0,
}
}
fn main() {
println!("=== Rust 09: Traits & Shared Behavior ===");
let cpu = CpuMetric {
core_id: 0,
usage_percent: 94.5,
};
let disk = DiskAlert {
device: "/dev/sda1".to_string(),
free_space_gb: 3,
critical_override: None,
};
println!("CPU: {}", cpu.summary());
println!("Disk: {}", disk.summary());
println!("CPU Dispatch: {}", format_and_dispatch(&cpu));
let items = vec![
cpu.clone(),
CpuMetric {
core_id: 1,
usage_percent: 45.0,
},
];
let critical = filter_critical(&items);
println!("Kritische CPU-Metriken: {}", critical.len());
}