Skip to main content

greentic_operator/messaging_universal/
dto.rs

1use serde::{Deserialize, Serialize};
2
3/// Base namespace version for HTTP ingress payloads.
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct HttpInV1 {
6    pub v: u32,
7    pub provider: String,
8    #[serde(default, skip_serializing_if = "Option::is_none")]
9    pub route: Option<String>,
10    #[serde(default, skip_serializing_if = "Option::is_none")]
11    pub binding_id: Option<String>,
12    #[serde(default, skip_serializing_if = "Option::is_none")]
13    pub tenant_hint: Option<String>,
14    #[serde(default, skip_serializing_if = "Option::is_none")]
15    pub team_hint: Option<String>,
16    pub method: String,
17    pub path: String,
18    #[serde(default, skip_serializing_if = "Vec::is_empty")]
19    pub query: Vec<(String, String)>,
20    #[serde(default, skip_serializing_if = "Vec::is_empty")]
21    pub headers: Vec<(String, String)>,
22    pub body_b64: String,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct HttpOutV1 {
27    pub v: u32,
28    pub status: u16,
29    #[serde(default, skip_serializing_if = "Vec::is_empty")]
30    pub headers: Vec<(String, String)>,
31    #[serde(default, skip_serializing_if = "Option::is_none")]
32    pub body_b64: Option<String>,
33    #[serde(default, skip_serializing_if = "Vec::is_empty")]
34    pub events: Vec<serde_json::Value>,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct RenderPlanInV1 {
39    pub v: u32,
40    pub message: serde_json::Value,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct RenderPlanOutPlan {
45    pub plan_json: String,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct RenderPlanOutV1 {
50    pub ok: bool,
51    #[serde(default, skip_serializing_if = "Option::is_none")]
52    pub plan: Option<RenderPlanOutPlan>,
53    #[serde(default, skip_serializing_if = "Option::is_none")]
54    pub error: Option<String>,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct EncodeInV1 {
59    pub v: u32,
60    pub message: serde_json::Value,
61    pub plan: serde_json::Value,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct EncodeOutV1 {
66    pub ok: bool,
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub payload: Option<ProviderPayloadV1>,
69    #[serde(default, skip_serializing_if = "Option::is_none")]
70    pub error: Option<String>,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct ProviderPayloadV1 {
75    pub content_type: String,
76    pub body_b64: String,
77    /// Accepts both `metadata` (BTreeMap from greentic-types) and legacy `metadata_json` (String).
78    #[serde(default, skip_serializing_if = "Option::is_none")]
79    pub metadata_json: Option<String>,
80    #[serde(default, skip_serializing_if = "Option::is_none")]
81    pub metadata: Option<serde_json::Value>,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct SendPayloadInV1 {
86    pub v: u32,
87    pub provider_type: String,
88    pub payload: ProviderPayloadV1,
89    pub tenant: TenantHint,
90    #[serde(default, skip_serializing_if = "Option::is_none")]
91    pub reply_scope: Option<serde_json::Value>,
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct SendPayloadOutV1 {
96    pub ok: bool,
97    #[serde(default, skip_serializing_if = "Option::is_none")]
98    pub message: Option<String>,
99    #[serde(default)]
100    pub retryable: bool,
101}
102
103/// Tenant/Team hints that accompany outbound requests.
104#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct TenantHint {
106    pub tenant: String,
107    #[serde(default, skip_serializing_if = "Option::is_none")]
108    pub team: Option<String>,
109    #[serde(default, skip_serializing_if = "Option::is_none")]
110    pub user: Option<String>,
111    #[serde(default, skip_serializing_if = "Option::is_none")]
112    pub correlation_id: Option<String>,
113}