use crate::display;
use crate::remote::MergeRequestListBodyArgs;
use crate::Result;
use crate::{api_traits::MergeRequest, remote::ListRemoteCliArgs};
use std::io::Write;
use std::sync::Arc;
use crate::api_traits::{
Cicd, CicdRunner, CommentMergeRequest, Deploy, RemoteProject, TrendingProjectURL,
};
use super::cicd::{RunnerListBodyArgs, RunnerListCliArgs};
use super::merge_request::{CommentMergeRequestListBodyArgs, CommentMergeRequestListCliArgs};
use super::project::{ProjectListBodyArgs, ProjectListCliArgs};
use super::release::ReleaseBodyArgs;
use super::trending::TrendingCliArgs;
use super::{cicd::PipelineBodyArgs, merge_request::MergeRequestListCliArgs};
macro_rules! query_pages {
($func_name:ident, $trait_name:ident) => {
pub fn $func_name<W: Write>(remote: Arc<dyn $trait_name>, mut writer: W) -> Result<()> {
process_num_pages(remote.num_pages(), &mut writer)
}
};
($func_name:ident, $trait_name:ident, $body_args:ident) => {
pub fn $func_name<W: Write>(
remote: Arc<dyn $trait_name>,
body_args: $body_args,
mut writer: W,
) -> Result<()> {
process_num_pages(remote.num_pages(body_args), &mut writer)
}
};
}
pub fn process_num_pages<W: Write>(num_pages: Result<Option<u32>>, mut writer: W) -> Result<()> {
match num_pages {
Ok(Some(pages)) => writer.write_all(format!("{pages}\n", pages = pages).as_bytes())?,
Ok(None) => {
writer.write_all(b"Number of pages not available.\n")?;
}
Err(e) => {
return Err(e);
}
};
Ok(())
}
query_pages!(num_release_pages, Deploy);
query_pages!(num_cicd_pages, Cicd);
query_pages!(
num_merge_request_pages,
MergeRequest,
MergeRequestListBodyArgs
);
query_pages!(num_project_pages, RemoteProject, ProjectListBodyArgs);
query_pages!(
num_comment_merge_request_pages,
CommentMergeRequest,
CommentMergeRequestListBodyArgs
);
macro_rules! list_resource {
($func_name:ident, $trait_name:ident, $body_args:ident, $cli_args:ident, $embeds_list_args: literal) => {
pub fn $func_name<W: Write>(
remote: Arc<dyn $trait_name>,
body_args: $body_args,
cli_args: $cli_args,
mut writer: W,
) -> Result<()> {
let objs = list_remote_objs!(remote, body_args, cli_args.list_args, writer);
display::print(&mut writer, objs, cli_args.list_args.get_args)?;
Ok(())
}
};
($func_name:ident, $trait_name:ident, $body_args:ident, $cli_args:ident) => {
pub fn $func_name<W: Write>(
remote: Arc<dyn $trait_name>,
body_args: $body_args,
cli_args: $cli_args,
mut writer: W,
) -> Result<()> {
let objs = list_remote_objs!(remote, body_args, cli_args, writer);
display::print(&mut writer, objs, cli_args.get_args)?;
Ok(())
}
};
}
#[macro_export]
macro_rules! list_remote_objs {
($remote:expr, $body_args:expr, $cli_args:expr, $writer:expr) => {{
let objs = $remote.list($body_args)?;
if $cli_args.flush {
return Ok(());
}
if objs.is_empty() {
$writer.write_all(b"No resources found.\n")?;
return Ok(());
}
objs
}};
}
list_resource!(
list_merge_requests,
MergeRequest,
MergeRequestListBodyArgs,
MergeRequestListCliArgs,
true
);
list_resource!(list_pipelines, Cicd, PipelineBodyArgs, ListRemoteCliArgs);
list_resource!(
list_runners,
CicdRunner,
RunnerListBodyArgs,
RunnerListCliArgs,
true
);
list_resource!(list_releases, Deploy, ReleaseBodyArgs, ListRemoteCliArgs);
list_resource!(
list_user_projects,
RemoteProject,
ProjectListBodyArgs,
ProjectListCliArgs,
true
);
list_resource!(
list_merge_request_comments,
CommentMergeRequest,
CommentMergeRequestListBodyArgs,
CommentMergeRequestListCliArgs,
true
);
list_resource!(list_trending, TrendingProjectURL, String, TrendingCliArgs);