edc_dataplane_core/
signaling.rs1use 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}