z_osmf 0.13.5

The Rust z/OSMF Client
Documentation
use std::marker::PhantomData;
use std::sync::Arc;

use z_osmf_macros::Endpoint;

use crate::convert::TryFromResponse;
use crate::ClientCore;

use super::{
    get_subsystem, JobAttributes, JobAttributesExec, JobAttributesExecStep, JobAttributesStep,
    JobIdentifier,
};

#[derive(Clone, Debug, Endpoint)]
#[endpoint(method = get, path = "/zosmf/restjobs/jobs{subsystem}/{identifier}")]
pub struct JobStatusBuilder<T>
where
    T: TryFromResponse,
{
    core: Arc<ClientCore>,

    #[endpoint(path, builder_fn = build_subsystem)]
    subsystem: Option<Arc<str>>,
    #[endpoint(path)]
    identifier: JobIdentifier,
    #[endpoint(skip_setter, builder_fn = build_exec_data)]
    exec_data: Option<bool>,
    #[endpoint(skip_setter, builder_fn = build_step_data)]
    step_data: Option<bool>,
    #[endpoint(query = "user-correlator")]
    user_correlator: Option<Arc<str>>,

    target_type: PhantomData<T>,
}

impl JobStatusBuilder<JobAttributes> {
    pub fn exec_data(self) -> JobStatusBuilder<JobAttributesExec> {
        JobStatusBuilder {
            core: self.core,
            subsystem: self.subsystem,
            identifier: self.identifier,
            exec_data: Some(true),
            step_data: self.step_data,
            user_correlator: self.user_correlator,
            target_type: PhantomData,
        }
    }

    pub fn step_data(self) -> JobStatusBuilder<JobAttributesStep> {
        JobStatusBuilder {
            core: self.core,
            subsystem: self.subsystem,
            identifier: self.identifier,
            exec_data: self.exec_data,
            step_data: Some(true),
            user_correlator: self.user_correlator,
            target_type: PhantomData,
        }
    }
}

impl JobStatusBuilder<JobAttributesExec> {
    pub fn step_data(self) -> JobStatusBuilder<JobAttributesExecStep> {
        JobStatusBuilder {
            core: self.core,
            subsystem: self.subsystem,
            identifier: self.identifier,
            exec_data: self.exec_data,
            step_data: Some(true),
            user_correlator: self.user_correlator,
            target_type: PhantomData,
        }
    }
}

impl JobStatusBuilder<JobAttributesStep> {
    pub fn exec_data(self) -> JobStatusBuilder<JobAttributesExecStep> {
        JobStatusBuilder {
            core: self.core,
            subsystem: self.subsystem,
            identifier: self.identifier,
            exec_data: Some(true),
            step_data: self.step_data,
            user_correlator: self.user_correlator,
            target_type: PhantomData,
        }
    }
}

fn build_exec_data<T>(
    request_builder: reqwest::RequestBuilder,
    builder: &JobStatusBuilder<T>,
) -> reqwest::RequestBuilder
where
    T: TryFromResponse,
{
    match builder.exec_data {
        Some(true) => request_builder.query(&[("exec-data", "Y")]),
        _ => request_builder,
    }
}

fn build_step_data<T>(
    request_builder: reqwest::RequestBuilder,
    builder: &JobStatusBuilder<T>,
) -> reqwest::RequestBuilder
where
    T: TryFromResponse,
{
    match builder.step_data {
        Some(true) => request_builder.query(&[("step-data", "Y")]),
        _ => request_builder,
    }
}

fn build_subsystem<T>(builder: &JobStatusBuilder<T>) -> String
where
    T: TryFromResponse,
{
    get_subsystem(&builder.subsystem)
}

#[cfg(test)]
mod tests {
    use crate::tests::*;

    use super::*;

    #[test]
    fn example_1() {
        let zosmf = get_zosmf();

        let manual_request = zosmf
            .core
            .client
            .get("https://test.com/zosmf/restjobs/jobs/BLSJPRMI/STC00052")
            .query(&[("exec-data", "Y")])
            .build()
            .unwrap();

        let identifier = JobIdentifier::NameId("BLSJPRMI".to_string(), "STC00052".to_string());
        let job_status = zosmf
            .jobs()
            .status(identifier)
            .exec_data()
            .get_request()
            .unwrap();

        assert_eq!(format!("{:?}", manual_request), format!("{:?}", job_status))
    }
}