Vincent Stuyck 6de616e8ab cargo fmt
2026-02-28 17:56:26 +01:00

341 lines
9.5 KiB
Rust

pub mod activations;
pub mod folders;
pub mod groups;
pub mod hosts;
pub mod tags;
use std::fmt::{self, Display};
use serde::{Deserialize, Serialize, de::DeserializeOwned};
use crate::Result;
use crate::client::InnerClient;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DomainType {
Link,
HostConfig,
FolderConfig,
ContactGroupConfig,
HostGroupConfig,
ServiceGroupConfig,
HostTagGroup,
ActivationRun,
}
impl fmt::Display for DomainType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DomainType::HostConfig => write!(f, "host_config"),
DomainType::FolderConfig => write!(f, "folder_config"),
DomainType::Link => write!(f, "link"),
DomainType::ContactGroupConfig => write!(f, "contact_group_config"),
DomainType::HostGroupConfig => write!(f, "host_group_config"),
DomainType::ServiceGroupConfig => write!(f, "service_group_config"),
DomainType::HostTagGroup => write!(f, "host_tag_group"),
DomainType::ActivationRun => write!(f, "activation_run"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum HttpMethod {
Get,
Put,
Post,
Delete,
}
// #[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
// pub(crate) struct RelationLink {
// #[serde(rename = "domainType")]
// pub domain_type: DomainType,
// pub rel: String,
// pub href: String,
// pub method: HttpMethod,
// pub r#type: String,
// #[serde(default)]
// pub title: Option<String>,
// // body_params: HashMap<String, String> // i will deal with this later
// }
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct DomainObject<E> {
pub domain_type: DomainType,
pub id: String,
#[serde(default)]
pub title: Option<String>,
pub extensions: E,
// not used in this library
// #[serde(default)]
// pub links: Vec<RelationLink>,
// deprecated in favour of links
// pub members: M
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct DomainCollection<E> {
pub domain_type: DomainType,
pub id: String,
#[serde(default)]
pub title: Option<String>,
pub value: Vec<DomainObject<E>>,
// not used in this library
// #[serde(default)]
// pub links: Vec<RelationLink>,
// pub extensions: Option<E>,
}
impl<E> From<DomainCollection<E>> for Vec<E> {
fn from(value: DomainCollection<E>) -> Self {
value.value.into_iter().map(|obj| obj.extensions).collect()
}
}
pub trait DomainExtension: DeserializeOwned + Serialize {
const DOMAIN_TYPE: DomainType;
}
impl InnerClient {
pub(crate) async fn create_domain_object<E, O, Q>(&self, object: &O, query: &Q) -> Result<()>
where
E: DomainExtension,
O: Serialize,
Q: Serialize,
{
self.create(E::DOMAIN_TYPE, object, query).await
}
pub(crate) async fn read_domain_object<E, Q>(
&self,
id: impl Display,
query: &Q,
) -> Result<DomainObject<E>>
where
E: DomainExtension,
Q: Serialize,
{
self.read(E::DOMAIN_TYPE, id, query).await
}
pub(crate) async fn update_domain_object<E, O>(
&self,
id: impl Display,
object: &O,
) -> Result<()>
where
E: DomainExtension,
O: Serialize,
{
self.update(E::DOMAIN_TYPE, id, object).await
}
pub(crate) async fn delete_domain_object<E, Q>(&self, id: impl Display, query: &Q) -> Result<()>
where
E: DomainExtension,
Q: Serialize,
{
self.delete(E::DOMAIN_TYPE, id, query).await
}
pub(crate) async fn bulk_create_domain_objects<E, O, Q>(
&self,
entries: &[O],
query: &Q,
) -> Result<()>
where
E: DomainExtension,
O: Serialize,
Q: Serialize,
{
self.bulk_create(E::DOMAIN_TYPE, entries, query).await
}
pub(crate) async fn bulk_read_domain_objects<E, Q>(
&self,
query: &Q,
) -> Result<DomainCollection<E>>
where
E: DomainExtension,
Q: Serialize,
{
self.bulk_read(E::DOMAIN_TYPE, query).await
}
pub(crate) async fn bulk_update_domain_objects<E, O>(&self, entries: &[O]) -> Result<()>
where
E: DomainExtension,
O: Serialize,
{
self.bulk_update(E::DOMAIN_TYPE, entries).await
}
pub(crate) async fn bulk_delete_domain_objects<E>(&self, entries: &[String]) -> Result<()>
where
E: DomainExtension,
{
self.bulk_delete(E::DOMAIN_TYPE, entries).await
}
}
macro_rules! domain_client {
($id:ident, $func:ident) => {
impl Client {
pub fn $func(&self) -> ApiClient<$id> {
self.into()
}
}
domain_client!($id);
};
($id:ident) => {
impl From<&Client> for ApiClient<$id> {
fn from(value: &Client) -> Self {
Self::new(value)
}
}
};
}
pub(super) use domain_client;
macro_rules! domain_create {
($id:ident, $object:ident) => {
impl ApiClient<$id> {
pub async fn create(&self, object: &$object) -> Result<()> {
self.inner
.create_domain_object::<$id, _, _>(object, &())
.await
}
}
};
($id:ident, $object:ident, $qry:ident) => {
impl ApiClient<$id> {
pub async fn create(&self, object: &$object, query: &$qry) -> Result<()> {
self.inner
.create_domain_object::<$id, _, _>(object, query)
.await
}
}
};
}
pub(super) use domain_create;
macro_rules! domain_read {
($id:ident) => {
impl ApiClient<$id> {
pub async fn read(&self, id: impl Display) -> Result<$id> {
self.inner
.read_domain_object::<$id, _>(id, &())
.await
.map(|obj| obj.extensions)
}
}
};
($id:ident, $qry:ident) => {
impl ApiClient<$id> {
pub async fn read(&self, id: impl Display, query: &$qry) -> Result<$id> {
self.inner
.read_domain_object::<$id, _>(id, &query)
.await
.map(|obj| obj.extensions)
}
}
};
}
pub(super) use domain_read;
macro_rules! domain_update {
($id:ident, $object:ident) => {
impl ApiClient<$id> {
pub async fn update(&self, id: impl Display, object: &$object) -> Result<()> {
self.inner.update_domain_object::<$id, _>(id, object).await
}
}
};
}
pub(super) use domain_update;
macro_rules! domain_delete {
($id:ident) => {
impl ApiClient<$id> {
pub async fn delete(&self, id: impl Display) -> Result<()> {
self.inner.delete_domain_object::<$id, _>(id, &()).await
}
}
};
($id:ident, $qry:ident) => {
impl ApiClient<$id> {
pub async fn delete(&self, id: impl Display, query: &$qry) -> Result<()> {
self.inner.delete_domain_object::<$id, _>(id, &query).await
}
}
};
}
pub(super) use domain_delete;
macro_rules! domain_bulk_create {
($id:ident, $object:ident) => {
impl ApiClient<$id> {
pub async fn bulk_create(&self, entries: &[$object]) -> Result<()> {
self.inner
.bulk_create_domain_objects::<$id, _, _>(entries, &())
.await
}
}
};
($id:ident, $object:ident, $qry:ident) => {
impl ApiClient<$id> {
pub async fn bulk_create(&self, entries: &[$object], query: &$qry) -> Result<()> {
self.inner
.bulk_create_domain_objects::<$id, _, _>(entries, query)
.await
}
}
};
}
pub(super) use domain_bulk_create;
macro_rules! domain_bulk_read {
($id:ident) => {
impl ApiClient<$id> {
pub async fn bulk_read(&self) -> Result<Vec<$id>> {
let collection = self.inner.bulk_read_domain_objects::<$id, _>(&()).await?;
Ok(collection.into())
}
}
};
($id:ident, $qry:ident) => {
impl ApiClient<$id> {
pub async fn bulk_read(&self, query: &$qry) -> Result<Vec<$id>> {
let collection = self
.inner
.bulk_read_domain_objects::<$id, _>(&query)
.await?;
Ok(collection.into())
}
}
};
}
pub(super) use domain_bulk_read;
macro_rules! domain_bulk_update {
($id:ident, $object:ident) => {
impl ApiClient<$id> {
pub async fn bulk_update(&self, entries: &[$object]) -> Result<()> {
self.inner
.bulk_update_domain_objects::<$id, _>(entries)
.await
}
}
};
}
pub(super) use domain_bulk_update;
macro_rules! domain_bulk_delete {
($id:ident) => {
impl ApiClient<$id> {
pub async fn bulk_delete(&self, entries: &[String]) -> Result<()> {
self.inner.bulk_delete_domain_objects::<$id>(entries).await
}
}
};
}
pub(super) use domain_bulk_delete;