use rusmpp_macros::Rusmpp;
use crate::{
pdus::owned::Pdu,
tlvs::owned::{BroadcastResponseTlvValue, Tlv},
types::owned::COctetString,
};
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Rusmpp)]
#[rusmpp(decode = owned, test = skip)]
#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
pub struct BroadcastSmResp {
pub message_id: COctetString<1, 65>,
#[rusmpp(length = "unchecked")]
tlvs: alloc::vec::Vec<Tlv>,
}
impl BroadcastSmResp {
pub fn new(
message_id: COctetString<1, 65>,
tlvs: alloc::vec::Vec<BroadcastResponseTlvValue>,
) -> Self {
let tlvs = tlvs.into_iter().map(From::from).collect();
Self { message_id, tlvs }
}
pub fn tlvs(&self) -> &[Tlv] {
&self.tlvs
}
pub fn set_tlvs(&mut self, tlvs: alloc::vec::Vec<BroadcastResponseTlvValue>) {
self.tlvs = tlvs.into_iter().map(From::from).collect();
}
pub fn clear_tlvs(&mut self) {
self.tlvs.clear();
}
pub fn push_tlv(&mut self, tlv: impl Into<BroadcastResponseTlvValue>) {
self.tlvs.push(Tlv::from(tlv.into()));
}
pub fn builder() -> BroadcastSmRespBuilder {
BroadcastSmRespBuilder::new()
}
}
impl From<BroadcastSmResp> for Pdu {
fn from(value: BroadcastSmResp) -> Self {
Self::BroadcastSmResp(value)
}
}
#[derive(Debug, Default)]
pub struct BroadcastSmRespBuilder {
inner: BroadcastSmResp,
}
impl BroadcastSmRespBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn message_id(mut self, message_id: COctetString<1, 65>) -> Self {
self.inner.message_id = message_id;
self
}
pub fn tlvs(mut self, tlvs: alloc::vec::Vec<BroadcastResponseTlvValue>) -> Self {
self.inner.set_tlvs(tlvs);
self
}
pub fn clear_tlvs(mut self) -> Self {
self.inner.clear_tlvs();
self
}
pub fn push_tlv(mut self, tlv: impl Into<BroadcastResponseTlvValue>) -> Self {
self.inner.push_tlv(tlv);
self
}
pub fn build(self) -> BroadcastSmResp {
self.inner
}
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use crate::{
CommandStatus,
tests::TestInstance,
types::owned::AnyOctetString,
values::{owned::*, *},
};
use super::*;
impl TestInstance for BroadcastSmResp {
fn instances() -> alloc::vec::Vec<Self> {
alloc::vec![
Self::default(),
Self::builder()
.message_id(
COctetString::from_str("12345678901234567890123456789012345678901234")
.unwrap(),
)
.build(),
Self::builder()
.message_id(
COctetString::from_str("12345678901234567890123456789012345678901234")
.unwrap(),
)
.push_tlv(BroadcastResponseTlvValue::BroadcastErrorStatus(
CommandStatus::EsmeRalybnd,
))
.build(),
Self::builder()
.message_id(
COctetString::from_str("12345678901234567890123456789012345678901234")
.unwrap(),
)
.tlvs(alloc::vec![
BroadcastResponseTlvValue::BroadcastErrorStatus(
CommandStatus::EsmeRbcastcancelfail,
),
BroadcastResponseTlvValue::BroadcastAreaIdentifier(
BroadcastAreaIdentifier::new(
BroadcastAreaFormat::Polygon,
AnyOctetString::from_static_slice(b"Polygon Area"),
),
),
])
.build(),
]
}
}
#[test]
fn encode_decode() {
crate::tests::owned::encode_decode_with_length_test_instances::<BroadcastSmResp>();
}
}