#![allow(clippy::missing_errors_doc)]
use serde::Deserialize;
use windows::core::HSTRING;
use windows::Win32::System::HostComputeSystem::HcsEnumerateComputeSystems;
use crate::error::HcsResult;
use crate::operation::run_operation;
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct EnumeratedSystem {
pub id: String,
#[serde(default)]
pub system_type: String,
#[serde(default)]
pub owner: String,
#[serde(default)]
pub runtime_id: Option<String>,
#[serde(default)]
pub state: String,
}
#[derive(Debug, Clone, Default, serde::Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct EnumerateQuery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub owners: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ids: Option<Vec<String>>,
}
pub async fn list(query: &EnumerateQuery) -> HcsResult<Vec<EnumeratedSystem>> {
let query_json = serde_json::to_string(query)?;
let query_w = HSTRING::from(query_json);
let result_json = run_operation(|op| {
match unsafe { HcsEnumerateComputeSystems(&query_w, op) } {
Ok(()) => windows::core::HRESULT(0),
Err(e) => e.code(),
}
})
.await?;
let trimmed = result_json.trim();
if trimmed.is_empty() || trimmed == "null" {
return Ok(Vec::new());
}
let systems: Vec<EnumeratedSystem> = serde_json::from_str(&result_json)?;
Ok(systems)
}
pub async fn list_by_owner(owner: &str) -> HcsResult<Vec<EnumeratedSystem>> {
list(&EnumerateQuery {
owners: Some(vec![owner.to_string()]),
ids: None,
})
.await
}