use rusmpp_macros::Rusmpp;
use crate::{
pdus::borrowed::Pdu,
types::borrowed::COctetString,
values::{borrowed::*, *},
};
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Rusmpp)]
#[rusmpp(decode = borrowed, test = skip)]
#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
pub struct CancelSm<'a> {
pub service_type: ServiceType<'a>,
pub message_id: COctetString<'a, 1, 65>,
pub source_addr_ton: Ton,
pub source_addr_npi: Npi,
pub source_addr: COctetString<'a, 1, 21>,
pub dest_addr_ton: Ton,
pub dest_addr_npi: Npi,
pub destination_addr: COctetString<'a, 1, 21>,
}
impl<'a> CancelSm<'a> {
#[allow(clippy::too_many_arguments)]
pub fn new(
service_type: ServiceType<'a>,
message_id: COctetString<'a, 1, 65>,
source_addr_ton: Ton,
source_addr_npi: Npi,
source_addr: COctetString<'a, 1, 21>,
dest_addr_ton: Ton,
dest_addr_npi: Npi,
destination_addr: COctetString<'a, 1, 21>,
) -> Self {
Self {
service_type,
message_id,
source_addr_ton,
source_addr_npi,
source_addr,
dest_addr_ton,
dest_addr_npi,
destination_addr,
}
}
pub fn builder() -> CancelSmBuilder<'a> {
CancelSmBuilder::new()
}
}
impl<'a, const N: usize> From<CancelSm<'a>> for Pdu<'a, N> {
fn from(value: CancelSm<'a>) -> Self {
Self::CancelSm(value)
}
}
#[derive(Debug, Default)]
pub struct CancelSmBuilder<'a> {
inner: CancelSm<'a>,
}
impl<'a> CancelSmBuilder<'a> {
pub fn new() -> Self {
Self::default()
}
pub fn service_type(mut self, service_type: ServiceType<'a>) -> Self {
self.inner.service_type = service_type;
self
}
pub fn message_id(mut self, message_id: COctetString<'a, 1, 65>) -> Self {
self.inner.message_id = message_id;
self
}
pub fn source_addr_ton(mut self, source_addr_ton: Ton) -> Self {
self.inner.source_addr_ton = source_addr_ton;
self
}
pub fn source_addr_npi(mut self, source_addr_npi: Npi) -> Self {
self.inner.source_addr_npi = source_addr_npi;
self
}
pub fn source_addr(mut self, source_addr: COctetString<'a, 1, 21>) -> Self {
self.inner.source_addr = source_addr;
self
}
pub fn dest_addr_ton(mut self, dest_addr_ton: Ton) -> Self {
self.inner.dest_addr_ton = dest_addr_ton;
self
}
pub fn dest_addr_npi(mut self, dest_addr_npi: Npi) -> Self {
self.inner.dest_addr_npi = dest_addr_npi;
self
}
pub fn destination_addr(mut self, destination_addr: COctetString<'a, 1, 21>) -> Self {
self.inner.destination_addr = destination_addr;
self
}
pub fn build(self) -> CancelSm<'a> {
self.inner
}
}
#[cfg(test)]
mod tests {
use crate::tests::TestInstance;
use super::*;
impl TestInstance for CancelSm<'_> {
fn instances() -> alloc::vec::Vec<Self> {
alloc::vec![
Self::default(),
Self::builder()
.service_type(ServiceType::default())
.message_id(COctetString::new(b"message_id\0").unwrap())
.source_addr_ton(Ton::International)
.source_addr_npi(Npi::Unknown)
.source_addr(COctetString::new(b"source_addr\0").unwrap())
.dest_addr_ton(Ton::International)
.dest_addr_npi(Npi::Unknown)
.destination_addr(COctetString::new(b"destination_addr\0").unwrap())
.build(),
]
}
}
#[test]
fn encode_decode() {
crate::tests::borrowed::encode_decode_test_instances::<CancelSm>();
}
}