use crate::client::apis;
use crate::client::commands::pagination::base::{
Paginatable, PaginatedIterator, PaginatedResponse, PaginationParams,
};
use crate::models::ResourceRequirementsModel;
use crate::time_utils::duration_string_to_seconds;
#[derive(Debug, Clone, Default)]
pub struct ResourceRequirementsListParams {
pub workflow_id: i64,
pub job_id: Option<i64>,
pub offset: i64,
pub limit: Option<i64>,
pub sort_by: Option<String>,
pub reverse_sort: Option<bool>,
pub name: Option<String>,
pub memory: Option<String>,
pub num_cpus: Option<i64>,
pub num_gpus: Option<i64>,
pub num_nodes: Option<i64>,
pub runtime: Option<String>,
}
impl ResourceRequirementsListParams {
pub fn new() -> Self {
Self::default()
}
pub fn with_job_id(mut self, job_id: i64) -> Self {
self.job_id = Some(job_id);
self
}
pub fn with_offset(mut self, offset: i64) -> Self {
self.offset = offset;
self
}
pub fn with_limit(mut self, limit: i64) -> Self {
self.limit = Some(limit);
self
}
pub fn with_sort_by(mut self, sort_by: String) -> Self {
self.sort_by = Some(sort_by);
self
}
pub fn with_reverse_sort(mut self, reverse: bool) -> Self {
self.reverse_sort = Some(reverse);
self
}
pub fn with_name(mut self, name: String) -> Self {
self.name = Some(name);
self
}
pub fn with_memory(mut self, memory: String) -> Self {
self.memory = Some(memory);
self
}
pub fn with_num_cpus(mut self, num_cpus: i64) -> Self {
self.num_cpus = Some(num_cpus);
self
}
pub fn with_num_gpus(mut self, num_gpus: i64) -> Self {
self.num_gpus = Some(num_gpus);
self
}
pub fn with_num_nodes(mut self, num_nodes: i64) -> Self {
self.num_nodes = Some(num_nodes);
self
}
pub fn with_runtime(mut self, runtime: String) -> Self {
self.runtime = Some(runtime);
self
}
}
impl PaginationParams for ResourceRequirementsListParams {
fn offset(&self) -> i64 {
self.offset
}
fn set_offset(&mut self, offset: i64) {
self.offset = offset;
}
fn limit(&self) -> Option<i64> {
self.limit
}
fn sort_by(&self) -> Option<&str> {
self.sort_by.as_deref()
}
fn reverse_sort(&self) -> Option<bool> {
self.reverse_sort
}
}
impl Paginatable for ResourceRequirementsModel {
type ListError = apis::resource_requirements_api::ListResourceRequirementsError;
type Params = ResourceRequirementsListParams;
fn fetch_page(
config: &apis::configuration::Configuration,
params: &Self::Params,
limit: i64,
) -> Result<PaginatedResponse<Self>, apis::Error<Self::ListError>> {
let response = apis::resource_requirements_api::list_resource_requirements(
config,
params.workflow_id,
params.job_id,
params.name.as_deref(),
params.memory.as_deref(),
params.num_cpus,
params.num_gpus,
params.num_nodes,
match params.runtime.as_deref() {
Some(runtime) => Some(
duration_string_to_seconds(runtime)
.or_else(|_| runtime.parse::<i64>().map_err(|e| e.to_string()))
.map_err(|e| apis::Error::Io(std::io::Error::other(e)))?,
),
None => None,
},
Some(params.offset),
Some(limit),
params.sort_by.as_deref(),
params.reverse_sort,
)?;
Ok(PaginatedResponse {
items: response.items,
has_more: response.has_more,
})
}
}
pub type ResourceRequirementsIterator = PaginatedIterator<ResourceRequirementsModel>;
pub fn iter_resource_requirements(
config: &apis::configuration::Configuration,
workflow_id: i64,
params: ResourceRequirementsListParams,
) -> ResourceRequirementsIterator {
let mut params = params;
params.workflow_id = workflow_id;
PaginatedIterator::new(config.clone(), params, None)
}
#[allow(clippy::result_large_err)]
pub fn paginate_resource_requirements(
config: &apis::configuration::Configuration,
workflow_id: i64,
params: ResourceRequirementsListParams,
) -> Result<
Vec<ResourceRequirementsModel>,
apis::Error<apis::resource_requirements_api::ListResourceRequirementsError>,
> {
iter_resource_requirements(config, workflow_id, params).collect()
}