use rust_decimal::Decimal;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
pub struct CurrencyCode(String);
impl CurrencyCode {
#[must_use]
pub fn new(value: impl Into<String>) -> Option<Self> {
let value = value.into().trim().to_ascii_uppercase();
if value.len() == 3
&& value
.chars()
.all(|character| character.is_ascii_alphabetic())
{
Some(Self(value))
} else {
None
}
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Money {
#[schemars(with = "String")]
pub amount: Decimal,
pub currency: CurrencyCode,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct Quantity {
#[schemars(with = "String")]
pub value: Decimal,
}
impl Quantity {
#[must_use]
pub const fn new(value: Decimal) -> Self {
Self { value }
}
}