use calendrical_calculations::rata_die::RataDie;
use crate::cal::iso::IsoDateInner;
use crate::error::DateError;
use crate::{types, DateDuration, DateDurationUnit};
use core::fmt;
pub trait Calendar: crate::cal::scaffold::UnstableSealed {
type DateInner: Eq + Copy + fmt::Debug;
type Year: fmt::Debug + Into<types::YearInfo>;
#[allow(clippy::wrong_self_convention)]
fn from_codes(
&self,
era: Option<&str>,
year: i32,
month_code: types::MonthCode,
day: u8,
) -> Result<Self::DateInner, DateError>;
#[allow(clippy::wrong_self_convention)]
fn from_iso(&self, iso: IsoDateInner) -> Self::DateInner;
fn to_iso(&self, date: &Self::DateInner) -> IsoDateInner;
#[allow(clippy::wrong_self_convention)]
fn from_rata_die(&self, rd: RataDie) -> Self::DateInner;
fn to_rata_die(&self, date: &Self::DateInner) -> RataDie;
fn months_in_year(&self, date: &Self::DateInner) -> u8;
fn days_in_year(&self, date: &Self::DateInner) -> u16;
fn days_in_month(&self, date: &Self::DateInner) -> u8;
fn is_in_leap_year(&self, date: &Self::DateInner) -> bool;
fn year_info(&self, date: &Self::DateInner) -> Self::Year;
fn extended_year(&self, date: &Self::DateInner) -> i32;
fn month(&self, date: &Self::DateInner) -> types::MonthInfo;
fn day_of_month(&self, date: &Self::DateInner) -> types::DayOfMonth;
fn day_of_year(&self, date: &Self::DateInner) -> types::DayOfYear;
#[doc(hidden)] fn offset_date(&self, date: &mut Self::DateInner, offset: DateDuration<Self>);
#[doc(hidden)] fn until(
&self,
date1: &Self::DateInner,
date2: &Self::DateInner,
calendar2: &Self,
largest_unit: DateDurationUnit,
smallest_unit: DateDurationUnit,
) -> DateDuration<Self>;
fn calendar_algorithm(&self) -> Option<crate::preferences::CalendarAlgorithm>;
fn debug_name(&self) -> &'static str;
}