use crate::scaffold::*;
use icu_calendar::types::{DayOfYear, RataDie};
use icu_calendar::{AsCalendar, Calendar};
use icu_time::scaffold::IntoOption;
use icu_time::zone::models::{AtTime, Base};
use icu_time::zone::ZoneNameTimestamp;
use icu_time::{Hour, Minute, Nanosecond, Second, TimeZoneInfo};
use icu_calendar::Date;
use icu_time::{zone::UtcOffset, Time, TimeZone};
pub(crate) use icu_calendar::types::{DayOfMonth, MonthInfo, Weekday, YearInfo};
#[cfg(doc)]
use crate::input::*;
#[derive(Debug, Copy, Clone, Default)]
#[non_exhaustive]
pub struct DateTimeInputUnchecked {
pub(crate) year: Option<YearInfo>,
pub(crate) month: Option<MonthInfo>,
pub(crate) day_of_month: Option<DayOfMonth>,
pub(crate) weekday: Option<Weekday>,
pub(crate) day_of_year: Option<DayOfYear>,
pub(crate) rata_die: Option<RataDie>,
pub(crate) hour: Option<Hour>,
pub(crate) minute: Option<Minute>,
pub(crate) second: Option<Second>,
pub(crate) subsecond: Option<Nanosecond>,
pub(crate) zone_id: Option<TimeZone>,
pub(crate) zone_offset: Option<UtcOffset>,
pub(crate) zone_name_timestamp: Option<ZoneNameTimestamp>,
}
impl DateTimeInputUnchecked {
pub fn set_date_fields_unchecked<C: Calendar, A: AsCalendar<Calendar = C>>(
&mut self,
date_in_calendar: Date<A>,
) {
self.year = Some(date_in_calendar.year());
self.month = Some(date_in_calendar.month());
self.day_of_month = Some(date_in_calendar.day_of_month());
self.weekday = Some(date_in_calendar.weekday());
self.day_of_year = Some(date_in_calendar.day_of_year());
}
pub fn set_time_fields(&mut self, time: Time) {
self.hour = Some(time.hour);
self.minute = Some(time.minute);
self.second = Some(time.second);
self.subsecond = Some(time.subsecond);
}
pub fn set_time_zone_utc_offset(&mut self, utc_offset: UtcOffset) {
self.zone_offset = Some(utc_offset);
}
pub fn set_time_zone_info_base_fields(&mut self, info: TimeZoneInfo<Base>) {
self.zone_id = Some(info.id());
self.zone_offset = self.zone_offset.or_else(|| info.offset());
}
pub fn set_time_zone_info_at_time_fields(&mut self, info: TimeZoneInfo<AtTime>) {
self.zone_id = Some(info.id());
self.zone_offset = self.zone_offset.or_else(|| info.offset());
self.zone_name_timestamp = Some(info.zone_name_timestamp());
}
pub fn set_time_zone_id(&mut self, id: TimeZone) {
self.zone_id = Some(id);
}
pub fn set_time_zone_name_timestamp(&mut self, timestamp: ZoneNameTimestamp) {
self.zone_name_timestamp = Some(timestamp);
}
#[deprecated]
pub fn set_time_zone_variant(&mut self, _zone_variant: icu_time::zone::TimeZoneVariant) {}
pub(crate) fn extract_from_neo_input<D, T, Z, I>(input: &I) -> Self
where
D: DateInputMarkers,
T: TimeMarkers,
Z: ZoneMarkers,
I: ?Sized
+ GetField<D::YearInput>
+ GetField<D::MonthInput>
+ GetField<D::DayOfMonthInput>
+ GetField<D::DayOfWeekInput>
+ GetField<D::DayOfYearInput>
+ GetField<D::RataDieInput>
+ GetField<T::HourInput>
+ GetField<T::MinuteInput>
+ GetField<T::SecondInput>
+ GetField<T::NanosecondInput>
+ GetField<Z::TimeZoneIdInput>
+ GetField<Z::TimeZoneOffsetInput>
+ GetField<Z::TimeZoneNameTimestampInput>,
{
Self {
year: GetField::<D::YearInput>::get_field(input).into_option(),
month: GetField::<D::MonthInput>::get_field(input).into_option(),
day_of_month: GetField::<D::DayOfMonthInput>::get_field(input).into_option(),
weekday: GetField::<D::DayOfWeekInput>::get_field(input).into_option(),
day_of_year: GetField::<D::DayOfYearInput>::get_field(input).into_option(),
rata_die: GetField::<D::RataDieInput>::get_field(input).into_option(),
hour: GetField::<T::HourInput>::get_field(input).into_option(),
minute: GetField::<T::MinuteInput>::get_field(input).into_option(),
second: GetField::<T::SecondInput>::get_field(input).into_option(),
subsecond: GetField::<T::NanosecondInput>::get_field(input).into_option(),
zone_id: GetField::<Z::TimeZoneIdInput>::get_field(input).into_option(),
zone_offset: GetField::<Z::TimeZoneOffsetInput>::get_field(input).into_option(),
zone_name_timestamp: GetField::<Z::TimeZoneNameTimestampInput>::get_field(input)
.into_option(),
}
}
}