Skip to main content

redispatch_xml/documents/
mod.rs

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