use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use std::fmt;
use crate::Domain;
#[derive(Debug, Clone, Builder, Serialize, Deserialize)]
pub struct EventRequest {
#[serde(rename = "type")]
pub event_type: EventType,
pub action: TerminalAction,
pub data: EventRequestData,
}
#[derive(Debug, Serialize, Deserialize, Clone, Builder)]
pub struct EventRequestData {
pub id: String,
#[builder(setter(strip_option), default)]
pub reference: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub enum EventType {
Invoice,
Transaction,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub enum TerminalAction {
Process,
View,
Print,
}
impl fmt::Display for TerminalAction {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let action = match self {
TerminalAction::Process => "process",
TerminalAction::Print => "print",
TerminalAction::View => "view",
};
write!(f, "{action}")
}
}
impl fmt::Display for EventType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let event = match self {
EventType::Invoice => "invoice",
EventType::Transaction => "transaction",
};
write!(f, "{event}")
}
}
#[derive(Debug, Serialize, Deserialize, Builder, Default)]
pub struct UpdateTerminalRequest {
#[builder(setter(strip_option), default)]
pub address: Option<String>,
#[builder(setter(strip_option), default)]
pub name: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct SendEventResponseData {
pub id: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct FetchEventStatusResponseData {
pub delivered: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct FetchTerminalStatusResponseData {
pub online: bool,
pub available: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct TerminalData {
pub id: u64,
pub serial_number: String,
pub device_make: Option<String>,
pub terminal_id: String,
pub integration: u64,
pub domain: Domain,
pub name: String,
pub address: Option<String>,
pub status: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn create_event_request() {
let even_request_data = EventRequestDataBuilder::default()
.id("some-id".to_string())
.reference("some-ref".to_string())
.build()
.expect("failed to build event request data");
let event_request = EventRequestBuilder::default()
.event_type(EventType::Invoice)
.action(TerminalAction::Process)
.data(even_request_data)
.build()
.expect("failed to build event request");
assert_eq!(&event_request.event_type, &EventType::Invoice);
assert_eq!(&event_request.action, &TerminalAction::Process);
assert_eq!(&event_request.data.id, "some-id");
assert_eq!(&event_request.data.reference, &Some("some-ref".to_string()))
}
#[test]
fn create_update_terminal_request() {
let update_request = UpdateTerminalRequestBuilder::default()
.address("some-address".to_string())
.name("some-name".to_string())
.build()
.expect("failed to build update terminal request");
assert_eq!(update_request.address, Some("some-address".to_string()));
assert_eq!(update_request.name, Some("some-name".to_string()));
}
}