edc_dataplane_core/
signaling.rs

1use std::collections::HashMap;
2
3use bon::Builder;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6use serde_with::{formats::PreferMany, serde_as, OneOrMany};
7
8#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
9#[serde(rename_all = "camelCase")]
10pub struct DataFlowStartMessage {
11    agreement_id: String,
12    dataset_id: String,
13    pub participant_id: String,
14    pub process_id: String,
15    flow_type: FlowType,
16    properties: HashMap<String, Value>,
17    pub source_data_address: DataAddress,
18}
19
20#[derive(Debug, Serialize, Deserialize, Clone)]
21#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
22pub enum FlowType {
23    Pull,
24}
25
26#[derive(Debug, Serialize, Deserialize, Clone)]
27#[serde(rename_all = "camelCase")]
28pub struct DataFlowResponseMessage {
29    pub data_address: Option<DataAddress>,
30}
31
32#[derive(Debug, Serialize, Deserialize, Clone)]
33#[serde(rename_all = "camelCase")]
34pub struct DataFlowTerminateMessage {
35    pub reason: Option<String>,
36}
37
38#[derive(Debug, Serialize, Deserialize, Clone)]
39#[serde(rename_all = "camelCase")]
40pub struct DataFlowSuspendMessage {
41    pub reason: Option<String>,
42}
43
44impl DataFlowTerminateMessage {}
45
46impl DataFlowResponseMessage {
47    pub fn new(data_address: Option<DataAddress>) -> Self {
48        Self { data_address }
49    }
50}
51
52#[serde_as]
53#[derive(Debug, Serialize, Deserialize, Clone, Builder, PartialEq)]
54#[serde(rename_all = "camelCase")]
55pub struct DataAddress {
56    #[serde(rename = "dspace:endpointType")]
57    pub endpoint_type: String,
58    #[serde_as(deserialize_as = "OneOrMany<_, PreferMany>")]
59    #[serde(rename = "dspace:endpointProperties")]
60    pub endpoint_properties: Vec<EndpointProperty>,
61}
62
63impl DataAddress {
64    pub fn get_property(&self, name: &str) -> Option<&str> {
65        self.endpoint_properties
66            .iter()
67            .find(|p| p.name == name)
68            .map(|p| p.value.as_str())
69    }
70}
71
72#[derive(Debug, Serialize, Deserialize, Clone, Builder, PartialEq)]
73pub struct EndpointProperty {
74    #[serde(rename = "dspace:name")]
75    #[builder(into)]
76    pub name: String,
77    #[serde(rename = "dspace:value")]
78    #[builder(into)]
79    pub value: String,
80}