rusp-lib 1.0.1

The Rust USP toolkit
Documentation
use crate::usp::mod_Body::OneOfmsg_body::{request, response};
use crate::usp::mod_GetInstancesResp::{CurrInstance, RequestedPathResult};
use crate::usp::mod_Request::OneOfreq_type::get_instances;
use crate::usp::mod_Response::OneOfresp_type::get_instances_resp;
use crate::usp::{Body, GetInstances, GetInstancesResp, Request, Response};

use crate::usp_errors;

use anyhow::Result;

#[derive(Clone)]
pub struct GetInstancesBuilder {
    obj_paths: Vec<String>,
    first_level_only: bool,
}

impl GetInstancesBuilder {
    #[must_use]
    pub const fn new() -> Self {
        Self {
            obj_paths: vec![],
            first_level_only: false,
        }
    }

    #[must_use]
    pub const fn with_first_level_only(mut self, first_level_only: bool) -> Self {
        self.first_level_only = first_level_only;
        self
    }

    #[must_use]
    pub fn with_obj_paths(mut self, obj_paths: Vec<String>) -> Self {
        self.obj_paths = obj_paths;
        self
    }

    pub fn build(self) -> Result<Body> {
        Ok(Body {
            msg_body: request({
                Request {
                    req_type: get_instances({
                        GetInstances {
                            obj_paths: self.obj_paths,
                            first_level_only: self.first_level_only,
                        }
                    }),
                }
            }),
        })
    }
}

#[derive(Clone)]
pub struct CurrInstanceBuilder {
    instantiated_obj_path: String,
    unique_keys: Vec<(String, String)>,
}

impl CurrInstanceBuilder {
    #[must_use]
    pub const fn new(instantiated_obj_path: String) -> Self {
        Self {
            instantiated_obj_path,
            unique_keys: vec![],
        }
    }

    #[must_use]
    pub fn with_unique_keys(mut self, unique_keys: Vec<(String, String)>) -> Self {
        self.unique_keys = unique_keys;
        self
    }

    pub fn build(self) -> Result<CurrInstance> {
        let unique_keys = self.unique_keys.into_iter().collect();

        Ok(CurrInstance {
            instantiated_obj_path: self.instantiated_obj_path,
            unique_keys,
        })
    }
}

#[derive(Clone)]
pub struct ReqPathResultBuilder {
    pub requested_path: String,
    pub err_code: u32,
    pub err_msg: Option<String>,
    pub curr_insts: Vec<CurrInstanceBuilder>,
}

impl ReqPathResultBuilder {
    #[must_use]
    pub const fn new(requested_path: String) -> Self {
        Self {
            requested_path,
            err_code: 0,
            err_msg: None,
            curr_insts: vec![],
        }
    }

    #[must_use]
    pub fn set_err(mut self, err_code: u32, err_msg: Option<String>) -> Self {
        self.err_code = err_code;
        self.err_msg = err_msg;
        self
    }

    #[must_use]
    pub fn with_curr_insts(mut self, curr_insts: Vec<CurrInstanceBuilder>) -> Self {
        self.curr_insts = curr_insts;
        self
    }

    pub fn build(self) -> Result<RequestedPathResult> {
        let err_msg = self
            .err_msg
            .clone()
            .unwrap_or_else(|| usp_errors::get_err_msg(self.err_code).to_string());

        let curr_insts = self
            .curr_insts
            .into_iter()
            .map(CurrInstanceBuilder::build)
            .collect::<Result<Vec<_>>>()?;

        Ok(RequestedPathResult {
            requested_path: self.requested_path,
            err_code: self.err_code,
            err_msg,
            curr_insts,
        })
    }
}

#[derive(Clone)]
pub struct GetInstancesRespBuilder {
    req_path_results: Vec<ReqPathResultBuilder>,
}

impl GetInstancesRespBuilder {
    #[must_use]
    pub const fn new() -> Self {
        Self {
            req_path_results: vec![],
        }
    }

    #[must_use]
    pub fn with_req_path_results(mut self, req_path_results: Vec<ReqPathResultBuilder>) -> Self {
        self.req_path_results = req_path_results;
        self
    }

    pub fn build(self) -> Result<Body> {
        let req_path_results = self
            .req_path_results
            .into_iter()
            .map(ReqPathResultBuilder::build)
            .collect::<Result<Vec<_>>>()?;

        Ok(Body {
            msg_body: response({
                Response {
                    resp_type: get_instances_resp(GetInstancesResp { req_path_results }),
                }
            }),
        })
    }
}