edc-connector-client 0.1.1

A Rust client for EDC
Documentation
use std::collections::HashSet;

use serde::{Deserialize, Serialize};

use crate::BuilderError;

use super::properties::{Properties, ToValue};

#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DataPlaneInstance {
    #[serde(rename = "@id")]
    id: String,
    url: String,
    allowed_source_types: HashSet<String>,
    allowed_dest_types: HashSet<String>,
    allowed_transfer_types: HashSet<String>,
    properties: Properties,
}

impl DataPlaneInstance {
    pub fn builder() -> DataPlaneInstanceBuilder {
        DataPlaneInstanceBuilder::default()
    }
}

#[derive(Debug, Default)]
pub struct DataPlaneInstanceBuilder {
    id: Option<String>,
    url: Option<String>,
    properties: Properties,
    allowed_source_types: HashSet<String>,
    allowed_dest_types: HashSet<String>,
    allowed_transfer_types: HashSet<String>,
}

impl DataPlaneInstanceBuilder {
    pub fn id(mut self, id: &str) -> Self {
        self.id = Some(id.to_string());
        self
    }

    pub fn url(mut self, url: &str) -> Self {
        self.url = Some(url.to_string());
        self
    }

    pub fn property<T>(mut self, property: &str, value: T) -> Self
    where
        T: ToValue,
    {
        self.properties.set(property, value);
        self
    }

    pub fn allowed_destination_type(mut self, dest_type: &str) -> Self {
        self.allowed_dest_types.insert(dest_type.to_string());
        self
    }

    pub fn allowed_source_type(mut self, source_type: &str) -> Self {
        self.allowed_source_types.insert(source_type.to_string());
        self
    }

    pub fn allowed_transfer_type(mut self, transfer_type: &str) -> Self {
        self.allowed_transfer_types
            .insert(transfer_type.to_string());
        self
    }

    pub fn build(self) -> Result<DataPlaneInstance, BuilderError> {
        Ok(DataPlaneInstance {
            id: self
                .id
                .ok_or_else(|| BuilderError::missing_property("id"))?,
            url: self
                .url
                .ok_or_else(|| BuilderError::missing_property("url"))?,
            allowed_source_types: self.allowed_source_types,
            allowed_dest_types: self.allowed_dest_types,
            allowed_transfer_types: self.allowed_transfer_types,
            properties: self.properties,
        })
    }
}