diff options
Diffstat (limited to 'crates/cli/src/modules/domain.rs')
-rw-r--r-- | crates/cli/src/modules/domain.rs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/crates/cli/src/modules/domain.rs b/crates/cli/src/modules/domain.rs new file mode 100644 index 00000000..f2fe7332 --- /dev/null +++ b/crates/cli/src/modules/domain.rs @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2020-2023, Stalwart Labs Ltd. + * + * This file is part of Stalwart Mail Server. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * in the LICENSE file at the top-level directory of this distribution. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * You can be released from the requirements of the AGPLv3 license by + * purchasing a commercial license. Please contact licensing@stalw.art + * for more details. +*/ + +use std::borrow::Cow; + +use prettytable::{Attr, Cell, Row, Table}; +use reqwest::Method; +use serde_json::Value; + +use super::cli::{Client, DomainCommands}; + +impl DomainCommands { + pub async fn exec(self, client: Client) { + match self { + DomainCommands::Create { name } => { + client + .http_request::<Value, String>( + Method::POST, + &format!("/admin/domain/{name}"), + None, + ) + .await; + eprintln!("Successfully created domain {name:?}"); + } + DomainCommands::Delete { name } => { + client + .http_request::<Value, String>( + Method::DELETE, + &format!("/admin/domain/{name}"), + None, + ) + .await; + eprintln!("Successfully deleted domain {name:?}"); + } + DomainCommands::List { from, limit } => { + let query = if from.is_none() && limit.is_none() { + Cow::Borrowed("/admin/domain") + } else { + let mut query = "/admin/domain?".to_string(); + if let Some(from) = &from { + query.push_str(&format!("from={from}")); + } + if let Some(limit) = limit { + query.push_str(&format!( + "{}limit={limit}", + if from.is_some() { "&" } else { "" } + )); + } + Cow::Owned(query) + }; + + let domains = client + .http_request::<Vec<String>, String>(Method::GET, query.as_ref(), None) + .await; + if !domains.is_empty() { + let mut table = Table::new(); + table.add_row(Row::new(vec![ + Cell::new("Domain Name").with_style(Attr::Bold) + ])); + + for domain in &domains { + table.add_row(Row::new(vec![Cell::new(domain)])); + } + + eprintln!(); + table.printstd(); + eprintln!(); + } + + eprintln!( + "\n\n{} domain{} found.\n", + domains.len(), + if domains.len() == 1 { "" } else { "s" } + ); + } + } + } +} |