#![cfg_attr(not(target_arch = "wasm32"), no_std)]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
extern crate alloc;
#[cfg(any(feature = "std", target_arch = "wasm32", test))]
extern crate std;
pub mod de;
#[cfg(feature = "_etsi")]
pub mod en;
#[cfg(feature = "_etsi")]
#[allow(clippy::all, clippy::pedantic, clippy::nursery, dead_code)]
pub mod standards;
#[cfg(feature = "geo")]
pub mod geo_utils;
#[cfg(feature = "time")]
pub mod time_utils;
#[cfg(feature = "transport")]
pub(crate) mod pcap;
#[cfg(feature = "transport")]
pub mod transport;
#[cfg(feature = "transport")]
pub use geonetworking::{Decode, Packet};
#[cfg(feature = "transport")]
pub use pcap::remove_pcap_headers;
#[cfg(feature = "_etsi")]
use transport::TransportHeader;
#[cfg(all(target_arch = "wasm32", any(feature = "json", feature = "_etsi")))]
use wasm_bindgen::prelude::*;
#[cfg(all(target_arch = "wasm32", feature = "json"))]
#[wasm_bindgen(getter_with_clone)]
#[derive(Debug, Clone, PartialEq, Default)]
pub struct JsonItsMessage {
pub geonetworking: Option<String>,
pub transport: Option<String>,
pub its: Option<String>,
pub message_type: u8,
}
#[cfg(all(target_arch = "wasm32", feature = "json"))]
#[wasm_bindgen]
impl JsonItsMessage {
#[wasm_bindgen(constructor)]
pub fn from(
its: Option<String>,
geonetworking: Option<String>,
transport: Option<String>,
message_type: u8,
) -> Self {
Self {
its,
geonetworking,
transport,
message_type,
}
}
}
#[cfg(feature = "_etsi")]
#[derive(Debug, Clone, PartialEq)]
pub enum ItsMessage<'a> {
#[cfg(feature = "denm_1_3_1")]
DenmV1 {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<standards::denm_1_3_1::denm_pdu_descriptions::DENM>,
},
#[cfg(feature = "denm_2_2_1")]
DenmV2 {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<standards::denm_2_2_1::denm_pdu_description::DENM>,
},
#[cfg(feature = "cam_1_4_1")]
Cam {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<standards::cam_1_4_1::cam_pdu_descriptions::CAM>,
},
#[cfg(feature = "spatem_2_2_1")]
Spatem {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<standards::spatem_2_2_1::spatem_pdu_descriptions::SPATEM>,
},
#[cfg(feature = "mapem_2_2_1")]
Mapem {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<standards::mapem_2_2_1::mapem_pdu_descriptions::MAPEM>,
},
#[cfg(feature = "ivim_2_1_1")]
IvimV1 {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<standards::ivim_2_1_1::ivim_pdu_descriptions::IVIM>,
},
#[cfg(feature = "ivim_2_2_1")]
IvimV2 {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<standards::ivim_2_2_1::ivim_pdu_descriptions::IVIM>,
},
#[cfg(feature = "srem_2_2_1")]
Srem {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<standards::srem_2_2_1::srem_pdu_descriptions::SREM>,
},
#[cfg(feature = "ssem_2_2_1")]
Ssem {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<standards::ssem_2_2_1::ssem_pdu_descriptions::SSEM>,
},
#[cfg(feature = "cpm_1")]
CpmV1 {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<standards::cpm_1::cpm_pdu_descriptions::CPM>,
},
#[cfg(feature = "cpm_2_1_1")]
CpmV2 {
geonetworking: Option<Packet<'a>>,
transport: Option<alloc::boxed::Box<TransportHeader>>,
etsi: alloc::boxed::Box<
standards::cpm_2_1_1::cpm_pdu_descriptions::CollectivePerceptionMessage,
>,
},
}
#[cfg(feature = "_etsi")]
impl From<&ItsMessage<'_>> for standards::extensions::ItsMessageId {
fn from(val: &ItsMessage<'_>) -> Self {
match val {
#[cfg(feature = "denm_1_3_1")]
ItsMessage::DenmV1 {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Denm,
#[cfg(feature = "denm_2_2_1")]
ItsMessage::DenmV2 {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Denm,
#[cfg(feature = "cam_1_4_1")]
ItsMessage::Cam {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Cam,
#[cfg(feature = "spatem_2_2_1")]
ItsMessage::Spatem {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Spatem,
#[cfg(feature = "mapem_2_2_1")]
ItsMessage::Mapem {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Mapem,
#[cfg(feature = "ivim_2_1_1")]
ItsMessage::IvimV1 {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Ivim,
#[cfg(feature = "ivim_2_2_1")]
ItsMessage::IvimV2 {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Ivim,
#[cfg(feature = "srem_2_2_1")]
ItsMessage::Srem {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Srem,
#[cfg(feature = "ssem_2_2_1")]
ItsMessage::Ssem {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Ssem,
#[cfg(feature = "cpm_1")]
ItsMessage::CpmV1 {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Cpm,
#[cfg(feature = "cpm_2_1_1")]
ItsMessage::CpmV2 {
geonetworking: _,
transport: _,
etsi: _,
} => Self::Cpm,
}
}
}
#[cfg(feature = "_etsi")]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum Headers {
None,
GnBtp,
RadioTap802LlcGnBtp,
IEEE802LlcGnBtp,
}
#[cfg(feature = "_etsi")]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum EncodingRules {
UPER,
XER,
JER,
}
#[cfg(any(
feature = "_etsi",
all(target_arch = "wasm32", feature = "_etsi", feature = "json"),
all(test, feature = "_etsi")
))]
impl EncodingRules {
pub(crate) fn codec(self) -> rasn::Codec {
match self {
EncodingRules::UPER => rasn::Codec::Uper,
EncodingRules::XER => rasn::Codec::Xer,
EncodingRules::JER => rasn::Codec::Jer,
}
}
}
#[cfg(any(feature = "transport", feature = "_etsi"))]
pub(crate) fn map_err_to_string<E: core::fmt::Debug>(error: E) -> alloc::string::String {
alloc::format!("{error:?}")
}