1use serde::{Deserialize, Serialize};
3
4use crate::documents::activation::EicCodingScheme;
5use crate::types::{Decimal3, Mrid, RevisionNumber, SimpleContent, UtcDateTime, UtcMinuteDateTime};
6
7pub const NAMESPACE: &str = "urn:iec62325.351:tc57wg16:451-6:outagedocument:3:0";
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
16pub enum KaskadeStatus {
17 #[serde(rename = "A07")]
19 Activated,
20 #[serde(rename = "A10")]
22 Ordered,
23 #[serde(rename = "A16")]
25 Deactivation,
26 #[serde(rename = "A35")]
28 Preliminary,
29}
30
31#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
33pub enum KaskadeType {
34 #[serde(rename = "Z16")]
36 EmergencyMeasures,
37 #[serde(rename = "Z17")]
39 TestMessage,
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
44pub enum KaskadeRoleType {
45 #[serde(rename = "A18")]
47 GridOperator,
48}
49
50#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
52pub enum KaskadeBusinessType {
53 #[serde(rename = "A01")]
55 Production,
56 #[serde(rename = "A04")]
58 Consumption,
59}
60
61#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
63pub enum CurveType {
64 #[serde(rename = "A03")]
66 VariableSizedBlock,
67}
68
69#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
71pub enum KaskadeMeasureUnit {
72 #[serde(rename = "MAW")]
74 Megawatt,
75}
76
77#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
79pub enum KaskadeReasonCode {
80 #[serde(rename = "Z19")]
82 LocalGridProblem,
83 #[serde(rename = "Z20")]
85 SystemBalanceProblem,
86}
87
88pub type ParticipantMrid = SimpleContent<String>;
92
93#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
95pub struct KaskadeMarketRole {
96 #[serde(rename = "type")]
98 pub role_type: KaskadeRoleType,
99}
100
101#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
103pub struct KaskadeParticipant {
104 #[serde(rename = "mRID")]
106 pub m_rid: ParticipantMrid,
107 #[serde(rename = "marketRole")]
109 pub market_role: KaskadeMarketRole,
110}
111
112#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
116pub struct StatusElement {
117 pub value: KaskadeStatus,
119}
120
121#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
125pub struct KaskadeTimeInterval {
126 #[serde(rename = "start", default, skip_serializing_if = "Option::is_none")]
128 pub start: Option<UtcMinuteDateTime>,
129 pub end: UtcMinuteDateTime,
131}
132
133#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
136pub struct AvailablePeriod {
137 #[serde(rename = "timeInterval")]
139 pub time_interval: KaskadeTimeInterval,
140 #[serde(
142 rename = "resolution",
143 default,
144 skip_serializing_if = "Option::is_none"
145 )]
146 pub resolution: Option<String>,
147 #[serde(rename = "Point", default, skip_serializing_if = "Vec::is_empty")]
149 pub points: Vec<KaskadePoint>,
150}
151
152#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
154pub struct KaskadePoint {
155 pub position: u32,
157 pub quantity: Decimal3,
159}
160
161#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
165pub struct KaskadeReason {
166 pub code: KaskadeReasonCode,
168 #[serde(
170 rename = "ReasonText",
171 default,
172 skip_serializing_if = "Option::is_none"
173 )]
174 pub reason_text: Option<String>,
175}
176
177#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
181pub enum ResourceObjScheme {
182 #[serde(rename = "A01")]
184 Eic,
185 #[serde(rename = "A02")]
187 NationalResource,
188 #[serde(rename = "NDE")]
190 Nde,
191 #[serde(rename = "Z01")]
193 Other,
194}
195
196pub type ResourceObjectRef = SimpleContent<String, ResourceObjScheme>;
198
199pub type BiddingZoneMrid = SimpleContent<String, EicCodingScheme>;
203
204#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
206pub struct BiddingZoneDomain {
207 #[serde(rename = "mRID")]
209 pub m_rid: BiddingZoneMrid,
210}
211
212#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
216pub struct QuantityMeasureUnit {
217 pub name: KaskadeMeasureUnit,
219}
220
221#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
225pub struct KaskadeTimeSeries {
226 #[serde(rename = "mRID")]
228 pub m_rid: Mrid,
229 #[serde(
231 rename = "senders_document_mRID",
232 default,
233 skip_serializing_if = "Option::is_none"
234 )]
235 pub senders_document_m_rid: Option<Mrid>,
236 #[serde(
238 rename = "senders_revisionNumber",
239 default,
240 skip_serializing_if = "Option::is_none"
241 )]
242 pub senders_revision_number: Option<RevisionNumber>,
243 #[serde(
245 rename = "senders_createdDateTime",
246 default,
247 skip_serializing_if = "Option::is_none"
248 )]
249 pub senders_created_date_time: Option<UtcDateTime>,
250 #[serde(rename = "businessType")]
252 pub business_type: KaskadeBusinessType,
253 #[serde(
255 rename = "ResourceObject",
256 default,
257 skip_serializing_if = "Vec::is_empty"
258 )]
259 pub resource_objects: Vec<ResourceObjectRef>,
260 #[serde(rename = "biddingZone_Domain")]
262 pub bidding_zone_domain: BiddingZoneDomain,
263 #[serde(rename = "quantity_Measure_Unit")]
265 pub quantity_measure_unit: QuantityMeasureUnit,
266 #[serde(rename = "curveType")]
268 pub curve_type: CurveType,
269 #[serde(rename = "Available_Period")]
271 pub available_period: AvailablePeriod,
272 #[serde(rename = "Reason")]
274 pub reason: KaskadeReason,
275}
276
277#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
288#[serde(rename = "Kaskade")]
289pub struct Kaskade {
290 #[serde(rename = "createdDateTime")]
292 pub created_date_time: UtcDateTime,
293 #[serde(rename = "mRID")]
295 pub m_rid: Mrid,
296 #[serde(rename = "revisionNumber")]
298 pub revision_number: RevisionNumber,
299 pub status: StatusElement,
301 #[serde(rename = "type")]
303 pub doc_type: KaskadeType,
304 #[serde(rename = "sender_MarketParticipant")]
306 pub sender_market_participant: KaskadeParticipant,
307 #[serde(rename = "receiver_MarketParticipant")]
309 pub receiver_market_participant: KaskadeParticipant,
310 #[serde(rename = "TimeSeries")]
312 pub time_series: KaskadeTimeSeries,
313}