Skip to main content

redispatch_xml/documents/
mod.rs

1pub mod acknowledgement;
2pub mod activation;
3pub mod kaskade;
4pub mod kostenblatt;
5pub mod network_constraint;
6pub mod planned_resource_schedule;
7pub mod stammdaten;
8pub mod status_request;
9pub mod unavailability;
10
11pub use acknowledgement::AcknowledgementDocument;
12pub use activation::ActivationDocument;
13pub use kaskade::Kaskade;
14pub use kostenblatt::Kostenblatt;
15pub use network_constraint::NetworkConstraintDocument;
16pub use planned_resource_schedule::PlannedResourceScheduleDocument;
17pub use stammdaten::Stammdaten;
18pub use status_request::StatusRequestMarketDocument;
19pub use unavailability::UnavailabilityMarketDocument;
20
21/// The set of all supported Redispatch 2.0 document types.
22///
23/// Used by [`crate::detect`] to identify the type of a document
24/// from its root element name, and as the variant discriminant for
25/// [`crate::Document`].
26#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
27pub enum DocumentType {
28    /// `ActivationDocument` (ACO/ACR/AAR).
29    Activation,
30    /// `PlannedResourceScheduleDocument`.
31    PlannedResourceSchedule,
32    /// `AcknowledgementDocument`.
33    Acknowledgement,
34    /// `Stammdaten`.
35    Stammdaten,
36    /// `StatusRequest_MarketDocument`.
37    StatusRequest,
38    /// `Unavailability_MarketDocument`.
39    Unavailability,
40    /// `Kaskade`.
41    Kaskade,
42    /// `NetworkConstraintDocument`.
43    NetworkConstraint,
44    /// `Kostenblatt`.
45    Kostenblatt,
46}
47
48impl DocumentType {
49    /// Return the XML root element name for this document type.
50    pub fn root_element_name(self) -> &'static str {
51        match self {
52            Self::Activation => "ActivationDocument",
53            Self::PlannedResourceSchedule => "PlannedResourceScheduleDocument",
54            Self::Acknowledgement => "AcknowledgementDocument",
55            Self::Stammdaten => "Stammdaten",
56            Self::StatusRequest => "StatusRequest_MarketDocument",
57            Self::Unavailability => "Unavailability_MarketDocument",
58            Self::Kaskade => "Kaskade",
59            Self::NetworkConstraint => "NetworkConstraintDocument",
60            Self::Kostenblatt => "Kostenblatt",
61        }
62    }
63
64    /// Return the expected XML namespace URI for this document type, if any.
65    pub fn expected_namespace(self) -> Option<&'static str> {
66        match self {
67            Self::Activation => Some(activation::NAMESPACE),
68            Self::StatusRequest => Some(status_request::NAMESPACE),
69            Self::Unavailability | Self::Kaskade => Some(kaskade::NAMESPACE),
70            Self::Stammdaten => Some("urn:kwep_stammdaten:1:0"),
71            _ => None,
72        }
73    }
74
75    /// Attempt to identify the document type from the root element local name.
76    ///
77    /// Returns `None` if the name is not a recognised Redispatch 2.0 root
78    /// element.
79    pub fn from_root_element(name: &str) -> Option<Self> {
80        match name {
81            "ActivationDocument" => Some(Self::Activation),
82            "PlannedResourceScheduleDocument" => Some(Self::PlannedResourceSchedule),
83            "AcknowledgementDocument" => Some(Self::Acknowledgement),
84            "Stammdaten" => Some(Self::Stammdaten),
85            "StatusRequest_MarketDocument" => Some(Self::StatusRequest),
86            "Unavailability_MarketDocument" => Some(Self::Unavailability),
87            "Kaskade" => Some(Self::Kaskade),
88            "NetworkConstraintDocument" => Some(Self::NetworkConstraint),
89            "Kostenblatt" => Some(Self::Kostenblatt),
90            _ => None,
91        }
92    }
93}