edc-dataplane-core 0.2.0

An EDC compatible dataplane
Documentation
use std::collections::HashMap;

use bon::Builder;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use serde_with::{formats::PreferMany, serde_as, OneOrMany};

#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
#[serde(rename_all = "camelCase")]
pub struct DataFlowStartMessage {
    agreement_id: String,
    dataset_id: String,
    pub participant_id: String,
    pub process_id: String,
    flow_type: FlowType,
    properties: HashMap<String, Value>,
    pub source_data_address: DataAddress,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum FlowType {
    Pull,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct DataFlowResponseMessage {
    pub data_address: Option<DataAddress>,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct DataFlowTerminateMessage {
    pub reason: Option<String>,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct DataFlowSuspendMessage {
    pub reason: Option<String>,
}

impl DataFlowTerminateMessage {}

impl DataFlowResponseMessage {
    pub fn new(data_address: Option<DataAddress>) -> Self {
        Self { data_address }
    }
}

#[serde_as]
#[derive(Debug, Serialize, Deserialize, Clone, Builder, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct DataAddress {
    #[serde(rename = "dspace:endpointType")]
    pub endpoint_type: String,
    #[serde_as(deserialize_as = "OneOrMany<_, PreferMany>")]
    #[serde(rename = "dspace:endpointProperties")]
    pub endpoint_properties: Vec<EndpointProperty>,
}

impl DataAddress {
    pub fn get_property(&self, name: &str) -> Option<&str> {
        self.endpoint_properties
            .iter()
            .find(|p| p.name == name)
            .map(|p| p.value.as_str())
    }
}

#[derive(Debug, Serialize, Deserialize, Clone, Builder, PartialEq)]
pub struct EndpointProperty {
    #[serde(rename = "dspace:name")]
    #[builder(into)]
    pub name: String,
    #[serde(rename = "dspace:value")]
    #[builder(into)]
    pub value: String,
}