use crate::common::money::Money;
use crate::common::note::Note;
use crate::common::tmf_error::TMFError;
use crate::{HasId, HasNote, TimePeriod, Uri};
use serde::{Deserialize, Serialize};
use tmflib_derive::{HasId, HasNote};
use super::MOD_PATH;
const CLASS_PATH: &str = "instruction";
#[derive(Clone, Default, Debug, Deserialize, Serialize)]
pub enum SignatureRequiredByType {
Adult,
#[default]
Receiver,
}
#[derive(Clone, Default, Debug, Deserialize, HasId, HasNote, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ShippingInstruction {
carrier_id: String,
carrier_name: String,
carrier_service_code: String,
delivery_attempts: u16,
delivery_speed: String,
delivery_time_slot: TimePeriod,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<Uri>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
insured_value: Option<Money>,
#[serde(skip_serializing_if = "Option::is_none")]
pub label_message: Option<String>,
package_type: String,
receipt_confirmation: String,
shipping_type: String,
signature_required: bool,
signature_required_by: Option<SignatureRequiredByType>,
warehouse_id: String,
pub note: Option<Vec<Note>>,
}
impl ShippingInstruction {
pub fn new(instruction: impl Into<String>) -> ShippingInstruction {
ShippingInstruction::create().message(instruction)
}
pub fn message(mut self, message: impl Into<String>) -> ShippingInstruction {
self.label_message = Some(message.into());
self
}
pub fn signature_required_by(
mut self,
signature: Option<SignatureRequiredByType>,
) -> ShippingInstruction {
match signature {
Some(s) => {
self.signature_required_by = Some(s);
self.signature_required = true;
}
None => {
self.signature_required_by = None;
self.signature_required = false;
}
};
self
}
}
impl From<String> for ShippingInstruction {
fn from(value: String) -> Self {
ShippingInstruction::new(value)
}
}
#[cfg(test)]
mod test {
use super::{ShippingInstruction, SignatureRequiredByType};
const INST: &str = "AnInstruction";
#[test]
fn test_instruction_create() {
let instruction = ShippingInstruction::new(INST);
assert_eq!(instruction.label_message.unwrap(), INST.to_string());
}
#[test]
fn test_instruction_from_string() {
let instruction: ShippingInstruction = INST.to_string().into();
assert_eq!(instruction.label_message.unwrap(), INST.to_string());
}
#[test]
fn test_instruction_signature() {
let instruction = ShippingInstruction::new(INST)
.signature_required_by(Some(SignatureRequiredByType::Receiver));
assert_eq!(instruction.signature_required, true);
}
}