#[derive(serde::Serialize)]
pub struct Message {
da: String,
ud: String,
#[serde(skip_serializing_if = "Option::is_none")]
limit: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
costcentre: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
private: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
oa: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
udh: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
srr: Option<String>,
}
impl Message {
pub fn builder() -> MessageBuilder {
MessageBuilder {
..MessageBuilder::default()
}
}
}
#[derive(Default, Debug)]
pub struct MessageBuilder {
da: Option<String>,
ud: Option<String>,
limit: Option<u8>,
costcentre: Option<String>,
private: Option<bool>,
oa: Option<String>,
udh: Option<String>,
srr: Option<String>,
}
impl MessageBuilder {
pub fn build(self) -> Message {
Message {
da: self
.da
.expect("Cannot build sms without destination, `da`."),
ud: self.ud.expect("Cannot build sms without message, `ud`."),
limit: self.limit,
costcentre: self.costcentre,
private: self.private,
oa: self.oa,
udh: self.udh,
srr: self.srr,
}
}
pub fn da(mut self, da: impl Into<String>) -> Self {
self.da = Some(da.into());
self
}
pub fn destination(self, destination: impl Into<String>) -> Self {
self.da(destination)
}
pub fn ud(mut self, ud: impl Into<String>) -> Self {
self.ud = Some(ud.into());
self
}
pub fn message(self, message: impl Into<String>) -> Self {
self.ud(message)
}
pub fn limit(mut self, limit: u8) -> Self {
self.limit = Some(limit);
self
}
pub fn costcentre(mut self, costcentre: impl Into<String>) -> Self {
self.costcentre = Some(costcentre.into());
self
}
pub fn private(mut self, private: bool) -> Self {
self.private = Some(private);
self
}
pub fn oa(mut self, oa: impl Into<String>) -> Self {
self.oa = Some(oa.into());
self
}
pub fn udh(mut self, udh: impl Into<String>) -> Self {
self.udh = Some(udh.into());
self
}
pub fn srr(mut self, srr: impl Into<String>) -> Self {
self.srr = Some(srr.into());
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn builder_default_all_none() {
let mb = Message::builder();
assert_eq!(mb.da, None);
assert_eq!(mb.ud, None);
assert_eq!(mb.limit, None);
assert_eq!(mb.costcentre, None);
assert_eq!(mb.private, None);
assert_eq!(mb.oa, None);
assert_eq!(mb.udh, None);
assert_eq!(mb.srr, None);
}
#[test]
fn basic_builder_setters_work() {
let mb = Message::builder().da("123");
assert_eq!(mb.da, Some(String::from("123")));
let mb = Message::builder().ud("123");
assert_eq!(mb.ud, Some(String::from("123")));
assert_eq!(mb.da, None);
let mb = Message::builder().limit(1);
assert_eq!(mb.limit, Some(1));
assert_eq!(mb.ud, None);
let mb = Message::builder().costcentre("123");
assert_eq!(mb.costcentre, Some(String::from("123")));
assert_eq!(mb.limit, None);
let mb = Message::builder().private(true);
assert_eq!(mb.private, Some(true));
assert_eq!(mb.costcentre, None);
let mb = Message::builder().oa("123");
assert_eq!(mb.oa, Some(String::from("123")));
assert_eq!(mb.private, None);
let mb = Message::builder().udh("123");
assert_eq!(mb.udh, Some(String::from("123")));
assert_eq!(mb.oa, None);
let mb = Message::builder().srr("123");
assert_eq!(mb.srr, Some(String::from("123")));
assert_eq!(mb.udh, None);
}
#[test]
fn basic_builder_works() {
let message = Message::builder().da("123").ud("456").build();
assert_eq!(message.da, "123");
assert_eq!(message.ud, "456");
}
#[test]
fn sugar_builder_works() {
let message = Message::builder().destination("123").message("456").build();
assert_eq!(message.da, "123");
assert_eq!(message.ud, "456");
}
#[test]
fn basic_builder_order_doesnt_matter() {
let message1 = Message::builder().da("123").ud("456").build();
let message2 = Message::builder().ud("456").da("123").build();
assert_eq!(message1.da, message2.da);
assert_eq!(message1.ud, message2.ud);
}
#[test]
fn sugar_or_basic_builder_doesnt_matter() {
let message1 = Message::builder().da("123").message("456").build();
let message2 = Message::builder().destination("123").ud("456").build();
assert_eq!(message1.da, message2.da);
assert_eq!(message1.ud, message2.ud);
}
#[test]
#[should_panic]
fn build_without_da_fails() {
Message::builder().ud("123").build();
}
#[test]
#[should_panic]
fn build_without_ud_fails() {
Message::builder().da("123").build();
}
}