1#![cfg_attr(not(feature = "std"), no_std)]
48
49#[cfg(feature = "std")]
50#[allow(clippy::indexing_slicing)]
51pub mod annotate;
52#[cfg(feature = "std")]
53pub mod manufacturers;
54pub mod mbus_data;
55#[cfg(feature = "std")]
56pub mod output;
57#[cfg(feature = "std")]
58mod rscada_xml;
59pub use m_bus_application_layer as user_data;
60
61pub use m_bus_core::decryption;
62use m_bus_core::ApplicationLayerError;
63pub use m_bus_core::{FrameError, Function};
65pub use wired_mbus_link_layer::{Address, WiredFrame};
66pub use wireless_mbus_link_layer::{ManufacturerId, WirelessFrame};
67
68#[cfg(feature = "std")]
69pub use mbus_data::serialize_mbus_data;
70#[cfg(feature = "std")]
71pub use output::{
72 decode_bytes, decode_data_records, decode_data_records_hex, decode_hex, decode_hex_bytes,
73 render_bytes, render_hex, DecodeOptions, DecodedOutput, OutputError, OutputFormat,
74 RenderOptions,
75};
76
77#[derive(Debug, Clone, Copy, PartialEq)]
78#[cfg_attr(feature = "serde", derive(serde::Serialize))]
79#[non_exhaustive]
80pub enum MbusError {
81 FrameError(FrameError),
82 WirelessFrameError(wireless_mbus_link_layer::FrameError),
83 ApplicationLayerError(ApplicationLayerError),
84 DataRecordError(user_data::variable_user_data::DataRecordError),
85}
86
87#[cfg(feature = "std")]
88impl std::fmt::Display for MbusError {
89 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
90 match self {
91 MbusError::FrameError(e) => write!(f, "{e}"),
92 MbusError::WirelessFrameError(e) => write!(f, "{:?}", e),
93 MbusError::ApplicationLayerError(e) => write!(f, "{e}"),
94 MbusError::DataRecordError(e) => write!(f, "{e}"),
95 }
96 }
97}
98
99#[cfg(feature = "std")]
100impl std::error::Error for MbusError {}
101
102impl From<FrameError> for MbusError {
103 fn from(error: FrameError) -> Self {
104 Self::FrameError(error)
105 }
106}
107
108impl From<ApplicationLayerError> for MbusError {
109 fn from(error: ApplicationLayerError) -> Self {
110 Self::ApplicationLayerError(error)
111 }
112}
113
114impl From<user_data::variable_user_data::DataRecordError> for MbusError {
115 fn from(error: user_data::variable_user_data::DataRecordError) -> Self {
116 Self::DataRecordError(error)
117 }
118}
119
120impl From<wireless_mbus_link_layer::FrameError> for MbusError {
121 fn from(error: wireless_mbus_link_layer::FrameError) -> Self {
122 Self::WirelessFrameError(error)
123 }
124}