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::RequestJson;

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

    #[endpoint(path)]
    path: Arc<str>,
    #[endpoint(builder_fn = build_body)]
    apf_authorized: Option<bool>,
    #[endpoint(skip_builder)]
    shared_library: Option<bool>,
    #[endpoint(skip_builder)]
    program_controlled: Option<bool>,
    #[endpoint(skip_builder)]
    shared_address_space: Option<bool>,

    target_type: PhantomData<T>,
}

fn build_body<T>(
    request_builder: reqwest::RequestBuilder,
    builder: &FileExtraAttributesSetBuilder<T>,
) -> reqwest::RequestBuilder
where
    T: TryFromResponse,
{
    let mut set = Vec::new();

    if builder.apf_authorized == Some(true) {
        set.push('a');
    }
    if builder.shared_library == Some(true) {
        set.push('l');
    }
    if builder.program_controlled == Some(true) {
        set.push('p');
    }
    if builder.shared_address_space == Some(true) {
        set.push('s');
    }
    let set = Some(set.into_iter().collect::<String>().into());

    request_builder.json(&RequestJson {
        request: "extattr",
        set,
        reset: None,
    })
}