#[macro_export]
macro_rules! datetime {
($year:literal-$month:literal-$day:literal $hour:literal:$min:literal:$sec:literal UTC) => {
$crate::time::datetime_utc($year, $month, $day, $hour, $min, $sec)
};
($year:literal-$month:literal-$day:literal $hour:literal:$min:literal UTC) => {
$crate::time::datetime_utc($year, $month, $day, $hour, $min, 0)
};
($year:literal-$month:literal-$day:literal UTC) => {
$crate::time::datetime_utc($year, $month, $day, 0, 0, 0)
};
}
#[macro_export]
macro_rules! try_datetime {
($year:literal-$month:literal-$day:literal $hour:literal:$min:literal:$sec:literal UTC) => {
$crate::time::datetime($year, $month, $day, $hour, $min, $sec)
};
($year:literal-$month:literal-$day:literal $hour:literal:$min:literal UTC) => {
$crate::time::datetime($year, $month, $day, $hour, $min, 0)
};
($year:literal-$month:literal-$day:literal UTC) => {
$crate::time::datetime($year, $month, $day, 0, 0, 0)
};
}
#[macro_export]
macro_rules! ticker {
($pair:literal) => {
$crate::Ticker::parse($pair).expect("Invalid currency pair")
};
($from:literal, $to:literal) => {
$crate::Ticker::new($from, $to)
};
}
#[macro_export]
macro_rules! try_ticker {
($pair:literal) => {
$crate::Ticker::parse($pair)
};
($from:literal, $to:literal) => {
$crate::Ticker::try_new($from, $to)
};
}
#[cfg(test)]
mod tests {
#[test]
fn test_datetime_macro_full() {
let dt = datetime!(2024-1-15 14:30:45 UTC);
use chrono::{Datelike, Timelike};
assert_eq!(dt.year(), 2024);
assert_eq!(dt.month(), 1);
assert_eq!(dt.day(), 15);
assert_eq!(dt.hour(), 14);
assert_eq!(dt.minute(), 30);
assert_eq!(dt.second(), 45);
}
#[test]
fn test_datetime_macro_no_seconds() {
let dt = datetime!(2024-6-15 10:30 UTC);
use chrono::{Datelike, Timelike};
assert_eq!(dt.year(), 2024);
assert_eq!(dt.month(), 6);
assert_eq!(dt.hour(), 10);
assert_eq!(dt.minute(), 30);
assert_eq!(dt.second(), 0);
}
#[test]
fn test_datetime_macro_date_only() {
let dt = datetime!(2024-12-25 UTC);
use chrono::{Datelike, Timelike};
assert_eq!(dt.year(), 2024);
assert_eq!(dt.month(), 12);
assert_eq!(dt.day(), 25);
assert_eq!(dt.hour(), 0);
}
#[test]
fn test_ticker_macro_string() {
let ticker = ticker!("EUR/USD");
assert_eq!(ticker.symbol(), "EURUSD");
}
#[test]
fn test_ticker_macro_two_codes() {
let ticker = ticker!("GBP", "JPY");
assert_eq!(ticker.symbol(), "GBPJPY");
}
#[test]
fn test_try_datetime_macro_returns_option() {
let ok = try_datetime!(2024-1-15 14:30 UTC);
assert!(ok.is_some());
}
#[test]
fn test_try_ticker_macro_returns_result() {
let ticker = try_ticker!("EUR/USD").unwrap();
assert_eq!(ticker.symbol(), "EURUSD");
let err = try_ticker!("BAD$", "USD").unwrap_err();
assert!(matches!(
err,
crate::DukascopyError::InvalidCurrencyCode { code, .. } if code == "BAD$"
));
}
}