pub(crate) mod create;
pub(crate) mod delete;
pub(crate) mod download;
pub(crate) mod edit;
pub(crate) mod read;
pub(crate) mod search;
pub(crate) mod write;
use anyhow::Result;
use clap::{Parser, Subcommand};
#[derive(Parser)]
pub struct ConfluenceCommand {
#[command(subcommand)]
pub command: ConfluenceSubcommands,
}
#[derive(Subcommand)]
pub enum ConfluenceSubcommands {
Read(read::ReadCommand),
Write(write::WriteCommand),
Edit(edit::EditCommand),
Search(search::SearchCommand),
Create(create::CreateCommand),
Delete(delete::DeleteCommand),
Download(download::DownloadCommand),
}
impl ConfluenceCommand {
pub async fn execute(self) -> Result<()> {
match self.command {
ConfluenceSubcommands::Read(cmd) => cmd.execute().await,
ConfluenceSubcommands::Write(cmd) => cmd.execute().await,
ConfluenceSubcommands::Edit(cmd) => cmd.execute().await,
ConfluenceSubcommands::Search(cmd) => cmd.execute().await,
ConfluenceSubcommands::Create(cmd) => cmd.execute().await,
ConfluenceSubcommands::Delete(cmd) => cmd.execute().await,
ConfluenceSubcommands::Download(cmd) => cmd.execute().await,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::cli::atlassian::format::{ContentFormat, OutputFormat};
#[test]
fn confluence_subcommands_read_variant() {
let cmd = ConfluenceCommand {
command: ConfluenceSubcommands::Read(read::ReadCommand {
id: "12345".to_string(),
output: None,
format: ContentFormat::Jfm,
}),
};
assert!(matches!(cmd.command, ConfluenceSubcommands::Read(_)));
}
#[test]
fn confluence_subcommands_write_variant() {
let cmd = ConfluenceCommand {
command: ConfluenceSubcommands::Write(write::WriteCommand {
id: "12345".to_string(),
file: None,
format: ContentFormat::Adf,
force: false,
dry_run: false,
}),
};
assert!(matches!(cmd.command, ConfluenceSubcommands::Write(_)));
}
#[test]
fn confluence_subcommands_edit_variant() {
let cmd = ConfluenceCommand {
command: ConfluenceSubcommands::Edit(edit::EditCommand {
id: "12345".to_string(),
}),
};
assert!(matches!(cmd.command, ConfluenceSubcommands::Edit(_)));
}
#[test]
fn confluence_subcommands_search_variant() {
let cmd = ConfluenceCommand {
command: ConfluenceSubcommands::Search(search::SearchCommand {
cql: Some("space = ENG".to_string()),
space: None,
title: None,
limit: 25,
output: OutputFormat::Table,
}),
};
assert!(matches!(cmd.command, ConfluenceSubcommands::Search(_)));
}
#[test]
fn confluence_subcommands_create_variant() {
let cmd = ConfluenceCommand {
command: ConfluenceSubcommands::Create(create::CreateCommand {
file: None,
format: ContentFormat::Jfm,
space: Some("ENG".to_string()),
title: Some("Test".to_string()),
parent: None,
dry_run: false,
}),
};
assert!(matches!(cmd.command, ConfluenceSubcommands::Create(_)));
}
#[test]
fn confluence_subcommands_delete_variant() {
let cmd = ConfluenceCommand {
command: ConfluenceSubcommands::Delete(delete::DeleteCommand {
id: "12345".to_string(),
force: true,
purge: false,
}),
};
assert!(matches!(cmd.command, ConfluenceSubcommands::Delete(_)));
}
#[test]
fn confluence_subcommands_download_variant() {
let cmd = ConfluenceCommand {
command: ConfluenceSubcommands::Download(download::DownloadCommand {
id: "12345".to_string(),
output_dir: std::path::PathBuf::from("."),
format: ContentFormat::Jfm,
concurrency: 8,
max_depth: 0,
resume: false,
on_conflict: download::OnConflict::Backup,
}),
};
assert!(matches!(cmd.command, ConfluenceSubcommands::Download(_)));
}
}