diff --git a/src/requests.rs b/src/requests.rs index 4f3152b..f1dd117 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -23,10 +23,15 @@ use crate::{ RegionListResponse, EmailUsageResponse, EmailDomainListResponse, + EmailDomainAddResponse, + EmailDomainRemoveResponse, EmailUserListResponse, EmailUserAddResponse, EmailUserRemoveResponse, EmailUserSetPasswordResponse, + EmailAliasListResponse, + EmailAliasAddResponse, + EmailAliasRemoveResponse, MonitorCheckListResponse, MonitorCheckTypesResponse, MonitorContactListResponse, @@ -82,6 +87,10 @@ pub enum ZoneSubArgs { pub enum EmailDomainSubArgs { /// `email domain list` List(EmailDomainListRequest), + /// `email domain add` + Add(EmailDomainAddRequest), + /// `email domain remove` + Remove(EmailDomainRemoveRequest), } #[derive(Serialize, Deserialize, Debug, clap::Subcommand)] @@ -97,6 +106,17 @@ pub enum EmailUserSubArgs { SetPassword(EmailUserSetPasswordRequest), } +#[derive(Serialize, Deserialize, Debug, clap::Subcommand)] +/// All possible `email alias` subcommands. +pub enum EmailAliasSubArgs { + /// `email alias list` + List(EmailAliasListRequest), + /// `email alias add` + Add(EmailAliasAddRequest), + /// `email alias remove` + Remove(EmailAliasRemoveRequest), +} + #[derive(Serialize, Deserialize, Debug, clap::Subcommand)] /// All possible `email` subcommands. pub enum EmailSubArgs { @@ -108,6 +128,9 @@ pub enum EmailSubArgs { #[clap(subcommand)] /// `email user` User(EmailUserSubArgs), + #[clap(subcommand)] + /// `email alias` + Alias(EmailAliasSubArgs) } #[derive(Serialize, Deserialize, Debug, clap::Subcommand)] @@ -314,10 +337,15 @@ impl Args { Self::Region(RegionSubArgs::List(reg_list)) => print_req(reg_list)?, Self::Email(EmailSubArgs::Usage(email_usage)) => print_req(email_usage)?, Self::Email(EmailSubArgs::Domain(EmailDomainSubArgs::List(email_domain_list))) => print_req(email_domain_list)?, + Self::Email(EmailSubArgs::Domain(EmailDomainSubArgs::Add(email_domain_add_req))) => print_req(email_domain_add_req)?, + Self::Email(EmailSubArgs::Domain(EmailDomainSubArgs::Remove(email_domain_rem_req))) => print_req(email_domain_rem_req)?, Self::Email(EmailSubArgs::User(EmailUserSubArgs::List(email_user_list))) => print_req(email_user_list)?, Self::Email(EmailSubArgs::User(EmailUserSubArgs::Add(email_add_user_req))) => print_req(email_add_user_req)?, Self::Email(EmailSubArgs::User(EmailUserSubArgs::Remove(email_del_req))) => print_req(email_del_req)?, Self::Email(EmailSubArgs::User(EmailUserSubArgs::SetPassword(email_user_set_password))) => print_req(email_user_set_password)?, + Self::Email(EmailSubArgs::Alias(EmailAliasSubArgs::List(email_alias_list))) => print_req(email_alias_list)?, + Self::Email(EmailSubArgs::Alias(EmailAliasSubArgs::Add(email_alias_add))) => print_req(email_alias_add)?, + Self::Email(EmailSubArgs::Alias(EmailAliasSubArgs::Remove(email_alias_rem))) => print_req(email_alias_rem)?, } Ok(()) } @@ -541,3 +569,44 @@ pub struct RecordRemoveRequest { /// The ID of the DNS record to remove. See [`RecordListResponse`] record_id: i32, } + +#[lunanode_request(response="EmailDomainAddResponse", endpoint="email/domain-add/")] +/// Adds a new domain to Lunanode's email server. +pub struct EmailDomainAddRequest { + /// The domain name you would like to add mail service for. + name: String, +} + +#[lunanode_request(response="EmailDomainRemoveResponse", endpoint="email/domain-remove/")] +/// Removes a domain from Lunanode's email service. +pub struct EmailDomainRemoveRequest { + /// The domain id which should be removed. See: [`EmailDomainListRequest`] + domain_id: i32, +} + +#[lunanode_request(response="EmailAliasListResponse", endpoint="email/alias-list/")] +/// Show all aliases for a given domain's email. +pub struct EmailAliasListRequest { + /// The domain id for which the email alias records will be fetched. See: [`EmailDomainListRequest`] + domain_id: i32, +} + +#[lunanode_request(response="EmailAliasAddResponse", endpoint="email/alias-add/")] +/// Add an email alias or a catch-all address. +pub struct EmailAliasAddRequest { + /// The domain id for which the alias will be set on. See: [`EmailDomainListRequest`] + domain_id: i32, + /// The name of the alias XYZ@example.com (use a blank string here for a catch-all). + name: String, + /// The destination of the alias, which should be an existing address on the system. + target: String, +} + +#[lunanode_request(response="EmailAliasRemoveResponse", endpoint="email/alias-remove/")] +/// Remove an email alias. +pub struct EmailAliasRemoveRequest { + /// The domain id for which the email alias will be deletes. + domain_id: i32, + /// The alias id to delete. + alias_id: i32, +} diff --git a/src/responses.rs b/src/responses.rs index 33234d7..ed1ff81 100644 --- a/src/responses.rs +++ b/src/responses.rs @@ -869,3 +869,45 @@ pub struct RecordAddResponse {} /// The result of remove a DNS record. /// See also: [`crate::requests::RecordRemoveRequest`] pub struct RecordRemoveResponse {} + +#[lunanode_response] +/// The result of remove a DNS record. +/// See also: [`crate::requests::RecordRemoveRequest`] +pub struct EmailDomainAddResponse {} + +#[lunanode_response] +/// The result of remove a DNS record. +/// See also: [`crate::requests::RecordRemoveRequest`] +pub struct EmailDomainRemoveResponse {} + +#[serde_as] +#[derive(Serialize, Deserialize, Debug)] +/// A single email alias +pub struct EmailAlias { + #[serde_as(as="DisplayFromStr")] + /// email alias id for a given domain; this needs to be used in conjunction with a domain ID to do anything useful. + id: i32, + /// The source address of the email (blank for catch-all). + source: String, + /// Where the final address is (this may be external). + destination: String, +} + +#[lunanode_response] +/// The result of listing email aliases. +/// See also: [`crate::requests::EmailAliasListRequest`] +pub struct EmailAliasListResponse { + #[serde(flatten)] + aliases: std::collections::HashMap, +} + +#[lunanode_response] +/// The result of adding a new email alias. +/// See also: [`crate::requests::EmailAliasListRequest`] +pub struct EmailAliasAddResponse {} + +#[lunanode_response] +/// The result removing an email alias. +/// See also: [`crate::requests::EmailAliasListRequest`] +pub struct EmailAliasRemoveResponse {} +