create a marco to add groups

This commit is contained in:
Vincent Stuyck 2026-01-10 18:47:23 +01:00
parent 361fe1d2b5
commit 8413131ed4
2 changed files with 98 additions and 0 deletions

97
src/api/groups.rs Normal file
View File

@ -0,0 +1,97 @@
use core::ops::Deref;
use serde::{Deserialize, Serialize};
#[cfg(feature = "schemars")]
use schemars::JsonSchema;
use crate::api::{
BulkCreateDomainExtension, BulkDeleteDomainExtension, BulkReadDomainExtension,
BulkUpdateDomainExtension, DomainExtension, DomainType
};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct Group {
pub name: String,
pub alias: String
}
impl Group {
fn new(name: String, alias: String) -> Self {
Self { name, alias }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct GroupAlias {
alias: String
}
impl GroupAlias {
fn new(alias: String) -> Self {
Self { alias }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct BulkGroupUpdate {
name: String,
attributes: GroupAlias
}
impl BulkGroupUpdate {
fn new(name: String, alias: String) -> Self {
Self {
name,
attributes: GroupAlias::new(alias)
}
}
}
macro_rules! domain_group {
($id:ident, $typ:expr) => {
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct $id(Group);
impl Deref for $id {
type Target = Group;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl $id {
fn new(name: String, alias: String) -> Self {
Self(Group::new(name, alias))
}
}
impl DomainExtension for $id {
const DOMAIN_TYPE: DomainType = $typ;
type CreationRequest = Group;
type CreationQuery = ();
type ReadQuery = ();
type UpdateRequest = GroupAlias;
type DeleteQuery = ();
}
impl BulkCreateDomainExtension for $id {}
impl BulkReadDomainExtension for $id {
type BulkReadQuery = ();
}
impl BulkUpdateDomainExtension for $id {
type BulkUpdateRequest = BulkGroupUpdate;
}
impl BulkDeleteDomainExtension for $id {}
}
}
domain_group!(HostGroup, DomainType::HostGroupConfig);
domain_group!(ServiceGroup, DomainType::ServiceGroupConfig);
domain_group!(ContactGroup, DomainType::ContactGroupConfig);

View File

@ -1,5 +1,6 @@
pub mod folders;
pub mod hosts;
pub mod groups;
pub(crate) mod rules;
use std::fmt;