use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct Program {
pub name: String,
pub version: Option<String>,
pub publisher: Option<String>,
#[serde(default)]
pub source: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct GuestTools {
pub kind: String,
pub version: Option<String>,
pub present: bool,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct GuestInfo {
pub os_name: String,
pub os_edition: String,
pub os_service_pack: String,
pub os_build: String,
pub guest_tools: Option<GuestTools>,
}
impl GuestInfo {
pub fn formatted_os_string(&self) -> String {
let mut details = Vec::new();
if !self.os_service_pack.is_empty() {
details.push(self.os_service_pack.clone());
}
if !self.os_edition.is_empty() {
details.push(format!("Version {}", self.os_edition));
}
if !self.os_build.is_empty() {
details.push(format!("Build {}", self.os_build));
}
if details.is_empty() {
self.os_name.clone()
} else {
format!("{} ({})", self.os_name, details.join(" - "))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_guest_info_formatted() {
let info = GuestInfo {
os_name: "Windows 10 Pro".to_string(),
os_edition: "22H2".to_string(),
os_build: "19045".to_string(),
os_service_pack: "SP1".to_string(),
..GuestInfo::default()
};
let s = info.formatted_os_string();
assert!(s.contains("Windows 10 Pro"));
assert!(s.contains("SP1"));
assert!(s.contains("Version 22H2"));
assert!(s.contains("Build 19045"));
}
#[test]
fn test_program_agnostic() {
let prog = Program {
name: "libssl3".to_string(),
version: Some("3.0.2".to_string()),
publisher: Some("libs".to_string()),
source: None,
};
assert_eq!(prog.name, "libssl3");
assert_eq!(prog.version.as_deref(), Some("3.0.2"));
assert_eq!(prog.publisher.as_deref(), Some("libs"));
assert_eq!(prog.source, None);
}
#[test]
fn test_guest_tools_serialization() {
let tools = GuestTools {
kind: "VirtualBox Guest Additions".to_string(),
version: Some("7.0.12".to_string()),
present: true,
};
assert_eq!(tools.kind, "VirtualBox Guest Additions");
assert_eq!(tools.version.as_deref(), Some("7.0.12"));
assert!(tools.present);
}
}