use std::sync::Arc;
use crate::core::client::{VimClient, Result};
#[derive(Clone)]
pub struct ExtensionManager {
client: Arc<dyn VimClient>,
mo_id: String,
}
impl ExtensionManager {
pub fn new(client: Arc<dyn VimClient>, mo_id: &str) -> Self {
Self {
client,
mo_id: mo_id.to_string(),
}
}
pub async fn find_extension(&self, extension_key: &str) -> Result<Option<crate::types::structs::Extension>> {
let input = FindExtensionRequestType {extension_key, };
let bytes_opt = self.client.invoke_optional("", "ExtensionManager", &self.mo_id, "FindExtension", Some(&input)).await?;
match bytes_opt {
Some(ref b) => Ok(Some(crate::core::client::unmarshal(self.client.transport(), b)?)),
None => Ok(None),
}
}
pub async fn get_public_key(&self) -> Result<String> {
let bytes = self.client.invoke("", "ExtensionManager", &self.mo_id, "GetPublicKey", None).await?;
let result: String = crate::core::client::unmarshal(self.client.transport(), &bytes)?;
Ok(result)
}
pub async fn query_extension_ip_allocation_usage(&self, extension_keys: Option<&[String]>) -> Result<Option<Vec<crate::types::structs::ExtensionManagerIpAllocationUsage>>> {
let input = QueryExtensionIpAllocationUsageRequestType {extension_keys, };
let bytes_opt = self.client.invoke_optional("", "ExtensionManager", &self.mo_id, "QueryExtensionIpAllocationUsage", Some(&input)).await?;
match bytes_opt {
Some(ref b) => Ok(Some(crate::core::client::unmarshal_array(self.client.transport(), b)?)),
None => Ok(None),
}
}
pub async fn query_managed_by(&self, extension_key: &str) -> Result<Option<Vec<crate::types::structs::ManagedObjectReference>>> {
let input = QueryManagedByRequestType {extension_key, };
let bytes_opt = self.client.invoke_optional("", "ExtensionManager", &self.mo_id, "QueryManagedBy", Some(&input)).await?;
match bytes_opt {
Some(ref b) => Ok(Some(crate::core::client::unmarshal_array(self.client.transport(), b)?)),
None => Ok(None),
}
}
pub async fn register_extension(&self, extension: &crate::types::structs::Extension) -> Result<()> {
let input = RegisterExtensionRequestType {extension, };
self.client.invoke_void("", "ExtensionManager", &self.mo_id, "RegisterExtension", Some(&input)).await
}
pub async fn set_extension_certificate(&self, extension_key: &str, certificate_pem: Option<&str>) -> Result<()> {
let input = SetExtensionCertificateRequestType {extension_key, certificate_pem, };
self.client.invoke_void("", "ExtensionManager", &self.mo_id, "SetExtensionCertificate", Some(&input)).await
}
pub async fn set_public_key(&self, extension_key: &str, public_key: &str) -> Result<()> {
let input = SetPublicKeyRequestType {extension_key, public_key, };
self.client.invoke_void("", "ExtensionManager", &self.mo_id, "SetPublicKey", Some(&input)).await
}
pub async fn set_service_account(&self, extension_key: &str, service_account: &str) -> Result<()> {
let input = SetServiceAccountRequestType {extension_key, service_account, };
self.client.invoke_void("", "ExtensionManager", &self.mo_id, "SetServiceAccount", Some(&input)).await
}
pub async fn unregister_extension(&self, extension_key: &str) -> Result<()> {
let input = UnregisterExtensionRequestType {extension_key, };
self.client.invoke_void("", "ExtensionManager", &self.mo_id, "UnregisterExtension", Some(&input)).await
}
pub async fn update_extension(&self, extension: &crate::types::structs::Extension) -> Result<()> {
let input = UpdateExtensionRequestType {extension, };
self.client.invoke_void("", "ExtensionManager", &self.mo_id, "UpdateExtension", Some(&input)).await
}
pub async fn extension_list(&self) -> Result<Option<Vec<crate::types::structs::Extension>>> {
let pv_opt = self.client.fetch_property_raw("", "ExtensionManager", &self.mo_id, "extensionList").await?;
match pv_opt {
Some(pv) => Ok(Some(crate::core::client::extract_property(pv)?)),
None => Ok(None),
}
}
}
struct FindExtensionRequestType<'a> {
extension_key: &'a str,
}
impl<'a> miniserde::Serialize for FindExtensionRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(FindExtensionRequestTypeSer { data: self, seq: 0 }))
}
}
struct FindExtensionRequestTypeSer<'b, 'a> {
data: &'b FindExtensionRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for FindExtensionRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"FindExtensionRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("extensionKey"), &self.data.extension_key as &dyn miniserde::Serialize)),
_ => return None,
}
}
}
struct QueryExtensionIpAllocationUsageRequestType<'a> {
extension_keys: Option<&'a [String]>,
}
impl<'a> miniserde::Serialize for QueryExtensionIpAllocationUsageRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(QueryExtensionIpAllocationUsageRequestTypeSer { data: self, seq: 0 }))
}
}
struct QueryExtensionIpAllocationUsageRequestTypeSer<'b, 'a> {
data: &'b QueryExtensionIpAllocationUsageRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for QueryExtensionIpAllocationUsageRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
loop {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"QueryExtensionIpAllocationUsageRequestType")),
1 => {
let Some(ref val) = self.data.extension_keys else { continue; };
return Some((std::borrow::Cow::Borrowed("extensionKeys"), val as &dyn miniserde::Serialize));
}
_ => return None,
}
}
}
}
struct QueryManagedByRequestType<'a> {
extension_key: &'a str,
}
impl<'a> miniserde::Serialize for QueryManagedByRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(QueryManagedByRequestTypeSer { data: self, seq: 0 }))
}
}
struct QueryManagedByRequestTypeSer<'b, 'a> {
data: &'b QueryManagedByRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for QueryManagedByRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"QueryManagedByRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("extensionKey"), &self.data.extension_key as &dyn miniserde::Serialize)),
_ => return None,
}
}
}
struct RegisterExtensionRequestType<'a> {
extension: &'a crate::types::structs::Extension,
}
impl<'a> miniserde::Serialize for RegisterExtensionRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(RegisterExtensionRequestTypeSer { data: self, seq: 0 }))
}
}
struct RegisterExtensionRequestTypeSer<'b, 'a> {
data: &'b RegisterExtensionRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for RegisterExtensionRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"RegisterExtensionRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("extension"), &self.data.extension as &dyn miniserde::Serialize)),
_ => return None,
}
}
}
struct SetExtensionCertificateRequestType<'a> {
extension_key: &'a str,
certificate_pem: Option<&'a str>,
}
impl<'a> miniserde::Serialize for SetExtensionCertificateRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(SetExtensionCertificateRequestTypeSer { data: self, seq: 0 }))
}
}
struct SetExtensionCertificateRequestTypeSer<'b, 'a> {
data: &'b SetExtensionCertificateRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for SetExtensionCertificateRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
loop {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"SetExtensionCertificateRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("extensionKey"), &self.data.extension_key as &dyn miniserde::Serialize)),
2 => {
let Some(ref val) = self.data.certificate_pem else { continue; };
return Some((std::borrow::Cow::Borrowed("certificatePem"), val as &dyn miniserde::Serialize));
}
_ => return None,
}
}
}
}
struct SetPublicKeyRequestType<'a> {
extension_key: &'a str,
public_key: &'a str,
}
impl<'a> miniserde::Serialize for SetPublicKeyRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(SetPublicKeyRequestTypeSer { data: self, seq: 0 }))
}
}
struct SetPublicKeyRequestTypeSer<'b, 'a> {
data: &'b SetPublicKeyRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for SetPublicKeyRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"SetPublicKeyRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("extensionKey"), &self.data.extension_key as &dyn miniserde::Serialize)),
2 => return Some((std::borrow::Cow::Borrowed("publicKey"), &self.data.public_key as &dyn miniserde::Serialize)),
_ => return None,
}
}
}
struct SetServiceAccountRequestType<'a> {
extension_key: &'a str,
service_account: &'a str,
}
impl<'a> miniserde::Serialize for SetServiceAccountRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(SetServiceAccountRequestTypeSer { data: self, seq: 0 }))
}
}
struct SetServiceAccountRequestTypeSer<'b, 'a> {
data: &'b SetServiceAccountRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for SetServiceAccountRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"SetServiceAccountRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("extensionKey"), &self.data.extension_key as &dyn miniserde::Serialize)),
2 => return Some((std::borrow::Cow::Borrowed("serviceAccount"), &self.data.service_account as &dyn miniserde::Serialize)),
_ => return None,
}
}
}
struct UnregisterExtensionRequestType<'a> {
extension_key: &'a str,
}
impl<'a> miniserde::Serialize for UnregisterExtensionRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(UnregisterExtensionRequestTypeSer { data: self, seq: 0 }))
}
}
struct UnregisterExtensionRequestTypeSer<'b, 'a> {
data: &'b UnregisterExtensionRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for UnregisterExtensionRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"UnregisterExtensionRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("extensionKey"), &self.data.extension_key as &dyn miniserde::Serialize)),
_ => return None,
}
}
}
struct UpdateExtensionRequestType<'a> {
extension: &'a crate::types::structs::Extension,
}
impl<'a> miniserde::Serialize for UpdateExtensionRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(UpdateExtensionRequestTypeSer { data: self, seq: 0 }))
}
}
struct UpdateExtensionRequestTypeSer<'b, 'a> {
data: &'b UpdateExtensionRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for UpdateExtensionRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"UpdateExtensionRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("extension"), &self.data.extension as &dyn miniserde::Serialize)),
_ => return None,
}
}
}