Skip to main content

redispatch_xml/documents/
status_request.rs

1use serde::{Deserialize, Serialize};
2
3use crate::documents::kaskade::ParticipantMrid;
4use crate::types::{Mrid, SimpleContent, UtcDateTime};
5
6// ── Namespace ─────────────────────────────────────────────────────────────────
7
8/// Expected XML namespace for `StatusRequest_MarketDocument`.
9pub const NAMESPACE: &str = "urn:iec62325.351:tc57wg16:451-5:statusrequestdocument:4:1";
10
11// ── Enumerations ──────────────────────────────────────────────────────────────
12
13/// Document type for `StatusRequest_MarketDocument`.
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
15pub enum StatusRequestDocType {
16    /// Status request.
17    #[serde(rename = "A60")]
18    StatusRequest,
19    /// Catalogue request.
20    #[serde(rename = "Z15")]
21    CatalogueRequest,
22}
23
24/// Sender role for `StatusRequest_MarketDocument`.
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
26pub enum StatusRequestSenderRole {
27    /// Grid operator.
28    #[serde(rename = "A18")]
29    GridOperator,
30    /// Data provider.
31    #[serde(rename = "A39")]
32    DataProvider,
33}
34
35/// Receiver role for `StatusRequest_MarketDocument`.
36#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
37pub enum StatusRequestReceiverRole {
38    /// Grid operator.
39    #[serde(rename = "A18")]
40    GridOperator,
41    /// Resource provider.
42    #[serde(rename = "A27")]
43    ResourceProvider,
44    /// Other / central.
45    #[serde(rename = "Z01")]
46    Other,
47}
48
49/// Market participant status used in `MktActivityRecord`.
50#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
51pub enum ParticipantStatus {
52    /// Deactivated.
53    #[serde(rename = "A03")]
54    Deactivated,
55    /// Reactivated.
56    #[serde(rename = "A04")]
57    Reactivated,
58    /// Withdrawn.
59    #[serde(rename = "A13")]
60    Withdrawn,
61}
62
63// ── Market role sub-element ───────────────────────────────────────────────────
64
65/// Market role element within `sender_MarketParticipant`.
66#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
67pub struct StatusRequestSenderMarketRole {
68    /// Role code.
69    #[serde(rename = "type")]
70    pub role_type: StatusRequestSenderRole,
71}
72
73/// Market role element within `receiver_MarketParticipant`.
74#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
75pub struct StatusRequestReceiverMarketRole {
76    /// Role code.
77    #[serde(rename = "type")]
78    pub role_type: StatusRequestReceiverRole,
79}
80
81// ── Sender / receiver participants ───────────────────────────────────────────
82
83/// Sender market participant reference.
84#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
85pub struct StatusRequestSender {
86    /// Market participant mRID (simpleContent: text + codingScheme).
87    #[serde(rename = "mRID")]
88    pub m_rid: ParticipantMrid,
89    /// Market role.
90    #[serde(rename = "marketRole")]
91    pub market_role: StatusRequestSenderMarketRole,
92}
93
94/// Receiver market participant reference.
95#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
96pub struct StatusRequestReceiver {
97    /// Market participant mRID (simpleContent: text + codingScheme).
98    #[serde(rename = "mRID")]
99    pub m_rid: ParticipantMrid,
100    /// Market role.
101    #[serde(rename = "marketRole")]
102    pub market_role: StatusRequestReceiverMarketRole,
103}
104
105// ── AttributeInstanceComponent ────────────────────────────────────────────────
106
107/// A generic key–value attribute (used for query parameters in status requests).
108#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
109pub struct AttributeInstanceComponent {
110    /// Attribute name.
111    #[serde(rename = "attribute")]
112    pub attribute: String,
113    /// Attribute value.
114    #[serde(
115        rename = "attributeValue",
116        default,
117        skip_serializing_if = "Option::is_none"
118    )]
119    pub attribute_value: Option<String>,
120}
121
122// ── MktActivityRecord ─────────────────────────────────────────────────────────
123
124/// Participant status record in a `StatusRequest_MarketDocument`.
125#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
126pub struct MktActivityRecord {
127    /// Market participant identifier (max 16 chars).
128    #[serde(rename = "MarketParticipant.mRID")]
129    pub market_participant_m_rid: SimpleContent<String>,
130    /// Participant status: deactivated, reactivated, or withdrawn.
131    pub status: ParticipantStatus,
132}
133
134// ── StatusRequest_MarketDocument ──────────────────────────────────────────────
135
136/// `StatusRequest_MarketDocument` — status request from a grid operator for
137/// resource provider participation data.
138///
139/// XSD version: 1.1 (2025-04-01)  
140/// Namespace: `urn:iec62325.351:tc57wg16:451-5:statusrequestdocument:4:1`
141#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
142#[serde(rename = "StatusRequest_MarketDocument")]
143pub struct StatusRequestMarketDocument {
144    /// Unique message identifier (max 35 chars).
145    #[serde(rename = "mRID")]
146    pub m_rid: Mrid,
147    /// Document type.
148    #[serde(rename = "type")]
149    pub doc_type: StatusRequestDocType,
150    /// Sender market participant.
151    #[serde(rename = "sender_MarketParticipant")]
152    pub sender_market_participant: StatusRequestSender,
153    /// Receiver market participant.
154    #[serde(rename = "receiver_MarketParticipant")]
155    pub receiver_market_participant: StatusRequestReceiver,
156    /// Document creation timestamp (UTC, second precision).
157    #[serde(rename = "createdDateTime")]
158    pub created_date_time: UtcDateTime,
159    /// Generic attribute–value components (query parameters).
160    #[serde(
161        rename = "AttributeInstanceComponent",
162        default,
163        skip_serializing_if = "Vec::is_empty"
164    )]
165    pub attributes: Vec<AttributeInstanceComponent>,
166    /// Participant status records.
167    #[serde(
168        rename = "MktActivityRecord",
169        default,
170        skip_serializing_if = "Vec::is_empty"
171    )]
172    pub mkt_activity_records: Vec<MktActivityRecord>,
173}