z_osmf 0.13.5

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

use serde::Serialize;
use z_osmf_macros::Endpoint;

use crate::convert::TryFromResponse;
use crate::restfiles::CopyDataType;
use crate::ClientCore;

#[derive(Clone, Debug, Endpoint)]
#[endpoint(method = put, path = "/zosmf/restfiles/fs{to_path}")]
pub struct FileCopyDatasetBuilder<T>
where
    T: TryFromResponse,
{
    core: Arc<ClientCore>,

    #[endpoint(builder_fn = build_body)]
    from_dataset: Arc<str>,
    #[endpoint(path)]
    to_path: Arc<str>,
    #[endpoint(skip_builder)]
    from_member: Option<Arc<str>>,
    #[endpoint(skip_builder)]
    dataset_type: Option<CopyDataType>,

    target_type: PhantomData<T>,
}

#[derive(Serialize)]
#[serde(rename_all = "kebab-case")]
struct RequestJson<'a> {
    request: &'static str,
    from_dataset: &'a FromDataset<'a>,
}

#[derive(Serialize)]
struct FromDataset<'a> {
    dsn: &'a str,
    #[serde(skip_serializing_if = "Option::is_none")]
    member: Option<&'a str>,
    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
    dataset_type: Option<CopyDataType>,
}

fn build_body<T>(
    request_builder: reqwest::RequestBuilder,
    builder: &FileCopyDatasetBuilder<T>,
) -> reqwest::RequestBuilder
where
    T: TryFromResponse,
{
    request_builder.json(&RequestJson {
        request: "copy",
        from_dataset: &FromDataset {
            dsn: &builder.from_dataset,
            member: builder.from_member.as_deref(),
            dataset_type: builder.dataset_type,
        },
    })
}

#[cfg(test)]
mod tests {
    use serde_json::{from_str, Value};

    use crate::tests::{get_zosmf, GetJson};

    use super::*;

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

        let json: Value = from_str(
            r#"
            {
                "request": "copy",
                "from-dataset": {
                    "dsn": "MY.TEST.PDS",
                    "member": "TEST",
                    "type": "text"
                }
            }
            "#,
        )
        .unwrap();
        let manual_request = zosmf
            .core
            .client
            .put("https://test.com/zosmf/restfiles/fs/u/jiahj/copyFile.txt")
            .json(&json)
            .build()
            .unwrap();

        let request = zosmf
            .files()
            .copy_dataset("MY.TEST.PDS", "/u/jiahj/copyFile.txt")
            .from_member("TEST")
            .dataset_type(CopyDataType::Text)
            .get_request()
            .unwrap();

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

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

        let json: Value = from_str(
            r#"
            {
                "request": "copy",
                "from-dataset": {
                    "dsn": "MY.TEST.DS"
                }
            }
            "#,
        )
        .unwrap();
        let manual_request = zosmf
            .core
            .client
            .put("https://test.com/zosmf/restfiles/fs/u/jiahj/copyFile.txt")
            .json(&json)
            .build()
            .unwrap();

        let request = zosmf
            .files()
            .copy_dataset("MY.TEST.DS", "/u/jiahj/copyFile.txt")
            .get_request()
            .unwrap();

        assert_eq!(format!("{:?}", manual_request), format!("{:?}", request));
        assert_eq!(manual_request.json(), request.json())
    }
}