/* * Copyright (c) 2021, Idan Horowitz * Copyright (c) 2021-2023, Linus Groh * Copyright (c) 2023-2024, Shannon Booth * Copyright (c) 2024, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace JS::Temporal { // 12.2.1 Calendar Date Records, https://tc39.es/proposal-temporal/#sec-temporal-calendar-date-records struct CalendarDate { Optional era; Optional era_year; i32 year { 0 }; u8 month { 0 }; String month_code; u8 day { 0 }; u8 day_of_week { 0 }; u16 day_of_year { 0 }; YearWeek week_of_year; u8 days_in_week { 0 }; u8 days_in_month { 0 }; u16 days_in_year { 0 }; u8 months_in_year { 0 }; bool in_leap_year { false }; }; // https://tc39.es/proposal-temporal/#table-temporal-calendar-fields-record-fields enum class CalendarField { Era, EraYear, Year, Month, MonthCode, Day, Hour, Minute, Second, Millisecond, Microsecond, Nanosecond, Offset, TimeZone, }; // https://tc39.es/proposal-temporal/#table-temporal-calendar-fields-record-fields struct CalendarFields { static CalendarFields unset() { return { .era = {}, .era_year = {}, .year = {}, .month = {}, .month_code = {}, .day = {}, .hour = {}, .minute = {}, .second = {}, .millisecond = {}, .microsecond = {}, .nanosecond = {}, .offset_string = {}, .time_zone = {}, }; } Optional era; Optional era_year; Optional year; Optional month; Optional month_code; Optional day; Optional hour { 0 }; Optional minute { 0 }; Optional second { 0 }; Optional millisecond { 0 }; Optional microsecond { 0 }; Optional nanosecond { 0 }; Optional offset_string; Optional time_zone; }; struct Partial { }; using CalendarFieldList = ReadonlySpan; using CalendarFieldListOrPartial = Variant; ThrowCompletionOr canonicalize_calendar(VM&, StringView id); Vector const& available_calendars(); ThrowCompletionOr prepare_calendar_fields(VM&, StringView calendar, Object const& fields, CalendarFieldList calendar_field_names, CalendarFieldList non_calendar_field_names, CalendarFieldListOrPartial required_field_names); ThrowCompletionOr calendar_date_from_fields(VM&, StringView calendar, CalendarFields&, Overflow); ThrowCompletionOr calendar_year_month_from_fields(VM&, StringView calendar, CalendarFields&, Overflow); ThrowCompletionOr calendar_month_day_from_fields(VM&, StringView calendar, CalendarFields&, Overflow); String format_calendar_annotation(StringView id, ShowCalendar); bool calendar_equals(StringView one, StringView two); u8 iso_days_in_month(double year, double month); YearWeek iso_week_of_year(ISODate); u16 iso_day_of_year(ISODate); u8 iso_day_of_week(ISODate); Vector calendar_field_keys_present(CalendarFields const&); CalendarFields calendar_merge_fields(StringView calendar, CalendarFields const& fields, CalendarFields const& additional_fields); ThrowCompletionOr calendar_date_add(VM&, StringView calendar, ISODate, DateDuration const&, Overflow); DateDuration calendar_date_until(VM&, StringView calendar, ISODate, ISODate, Unit largest_unit); ThrowCompletionOr to_temporal_calendar_identifier(VM&, Value temporal_calendar_like); ThrowCompletionOr get_temporal_calendar_identifier_with_iso_default(VM&, Object const& item); ThrowCompletionOr calendar_date_to_iso(VM&, StringView calendar, CalendarFields const&, Overflow); ThrowCompletionOr calendar_month_day_to_iso_reference_date(VM&, StringView calendar, CalendarFields const&, Overflow); CalendarDate calendar_iso_to_date(StringView calendar, ISODate); Vector calendar_extra_fields(StringView calendar, CalendarFieldList); Vector calendar_field_keys_to_ignore(StringView calendar, ReadonlySpan); ThrowCompletionOr calendar_resolve_fields(VM&, StringView calendar, CalendarFields&, DateType); }