use crate::GregorianDate;
use crate::GregorianDateError;
use crate::ShahanshahiDate;
use crate::ShahanshahiDateError;
use ::chrono::{Datelike, NaiveDate};
use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ChronoNaiveDateOutOfRange;
impl fmt::Display for ChronoNaiveDateOutOfRange {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"Gregorian date is outside the year range supported by chrono::NaiveDate",
)
}
}
#[cfg(feature = "std")]
impl std::error::Error for ChronoNaiveDateOutOfRange {}
impl GregorianDate {
pub fn try_from_chrono_naive_date(date: NaiveDate) -> Result<Self, GregorianDateError> {
GregorianDate::try_new(date.year(), date.month() as u8, date.day() as u8)
}
pub fn to_chrono_naive_date(self) -> Result<NaiveDate, ChronoNaiveDateOutOfRange> {
NaiveDate::from_ymd_opt(self.year(), u32::from(self.month()), u32::from(self.day()))
.ok_or(ChronoNaiveDateOutOfRange)
}
}
impl ShahanshahiDate {
pub fn try_from_chrono_naive_date(date: NaiveDate) -> Result<Self, ShahanshahiDateError> {
let g = GregorianDate::try_from_chrono_naive_date(date)?;
Self::try_from_gregorian(g)
}
pub fn to_chrono_naive_date(self) -> Result<NaiveDate, ChronoNaiveDateOutOfRange> {
self.to_gregorian().to_chrono_naive_date()
}
#[cfg(feature = "proleptic")]
pub fn try_from_chrono_naive_date_proleptic(
date: NaiveDate,
) -> Result<Self, ShahanshahiDateError> {
let g = GregorianDate::try_from_chrono_naive_date(date)?;
Self::try_from_gregorian_proleptic(g)
}
}