Skip to main content

redispatch_xml/documents/
status_request.rs

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