use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct Programa {
pub nombre: String,
pub version: Option<String>,
pub editor: Option<String>,
#[serde(default)]
pub origen: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct HerramientasGuest {
pub tipo: String,
pub version: Option<String>,
pub presente: bool,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct VMInfo {
pub os_nombre: String,
pub os_edition_version: String,
pub os_service_pack: String,
pub os_build: String,
pub guest_tools: Option<HerramientasGuest>,
}
impl VMInfo {
pub fn os_cadena_formateada(&self) -> String {
let mut detalles = Vec::new();
if !self.os_service_pack.is_empty() {
detalles.push(self.os_service_pack.clone());
}
if !self.os_edition_version.is_empty() {
detalles.push(format!("Versión {}", self.os_edition_version));
}
if !self.os_build.is_empty() {
detalles.push(format!("Build {}", self.os_build));
}
if detalles.is_empty() {
self.os_nombre.clone()
} else {
format!("{} ({})", self.os_nombre, detalles.join(" - "))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_vminfo_formateado() {
let info = VMInfo {
os_nombre: "Windows 10 Pro".to_string(),
os_edition_version: "22H2".to_string(),
os_build: "19045".to_string(),
os_service_pack: "SP1".to_string(),
..VMInfo::default()
};
let s = info.os_cadena_formateada();
assert!(s.contains("Windows 10 Pro"));
assert!(s.contains("SP1"));
assert!(s.contains("Versión 22H2"));
assert!(s.contains("Build 19045"));
}
#[test]
fn test_programa_agnostico() {
let prog = Programa {
nombre: "libssl3".to_string(),
version: Some("3.0.2".to_string()),
editor: Some("libs".to_string()),
origen: None,
};
assert_eq!(prog.nombre, "libssl3");
assert_eq!(prog.version.as_deref(), Some("3.0.2"));
assert_eq!(prog.editor.as_deref(), Some("libs"));
assert_eq!(prog.origen, None);
}
#[test]
fn test_herramientas_guest_serializacion() {
let tools = HerramientasGuest {
tipo: "VirtualBox Guest Additions".to_string(),
version: Some("7.0.12".to_string()),
presente: true,
};
assert_eq!(tools.tipo, "VirtualBox Guest Additions");
assert_eq!(tools.version.as_deref(), Some("7.0.12"));
assert!(tools.presente);
}
}