Add a mozilla::intl::DateIntervalFormat class, with two methods: - TryFormatCalendar - TryFormatDateTime and a mozilla::intl::AutoFormattedDateInterval class, which is a RAII class calling udtitvfmt_openResult and udtitvfmt_closeResult for DateIntervalFormat operations. Differential Revision: https://phabricator.services.mozilla.com/D125642
134 lines
3.5 KiB
C++
134 lines
3.5 KiB
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
#ifndef intl_components_Calendar_h_
|
|
#define intl_components_Calendar_h_
|
|
|
|
#include "mozilla/Assertions.h"
|
|
#include "mozilla/EnumSet.h"
|
|
#include "mozilla/intl/ICU4CGlue.h"
|
|
#include "mozilla/intl/ICUError.h"
|
|
#include "mozilla/Maybe.h"
|
|
#include "mozilla/Result.h"
|
|
#include "mozilla/Span.h"
|
|
#include "mozilla/UniquePtr.h"
|
|
|
|
using UCalendar = void*;
|
|
|
|
namespace mozilla::intl {
|
|
|
|
/**
|
|
* Weekdays in the ISO-8601 calendar.
|
|
*/
|
|
enum class Weekday : uint8_t {
|
|
Monday = 1,
|
|
Tuesday,
|
|
Wednesday,
|
|
Thursday,
|
|
Friday,
|
|
Saturday,
|
|
Sunday,
|
|
};
|
|
|
|
/**
|
|
* This component is a Mozilla-focused API for working with calendar systems in
|
|
* internationalization code. It is used in coordination with other operations
|
|
* such as datetime formatting.
|
|
*/
|
|
class Calendar final {
|
|
public:
|
|
explicit Calendar(UCalendar* aCalendar) : mCalendar(aCalendar) {
|
|
MOZ_ASSERT(aCalendar);
|
|
};
|
|
|
|
// Do not allow copy as this class owns the ICU resource. Move is not
|
|
// currently implemented, but a custom move operator could be created if
|
|
// needed.
|
|
Calendar(const Calendar&) = delete;
|
|
Calendar& operator=(const Calendar&) = delete;
|
|
|
|
/**
|
|
* Create a Calendar.
|
|
*/
|
|
static Result<UniquePtr<Calendar>, ICUError> TryCreate(
|
|
const char* aLocale,
|
|
Maybe<Span<const char16_t>> aTimeZoneOverride = Nothing{});
|
|
|
|
/**
|
|
* Get the BCP 47 keyword value string designating the calendar type. For
|
|
* instance "gregory", "chinese", "islamic-civil", etc.
|
|
*/
|
|
Result<Span<const char>, ICUError> GetBcp47Type();
|
|
|
|
/**
|
|
* Return the set of weekdays which are considered as part of the weekend.
|
|
*/
|
|
Result<EnumSet<Weekday>, ICUError> GetWeekend();
|
|
|
|
/**
|
|
* Return the weekday which is considered the first day of the week.
|
|
*/
|
|
Weekday GetFirstDayOfWeek();
|
|
|
|
/**
|
|
* Return the minimal number of days in the first week of a year.
|
|
*/
|
|
int32_t GetMinimalDaysInFirstWeek();
|
|
|
|
/**
|
|
* Set the time for the calendar relative to the number of milliseconds since
|
|
* 1 January 1970, UTC.
|
|
*/
|
|
Result<Ok, ICUError> SetTimeInMs(double aUnixEpoch);
|
|
|
|
/**
|
|
* Return ICU legacy keywords, such as "gregorian", "islamic",
|
|
* "islamic-civil", "hebrew", etc.
|
|
*/
|
|
static Result<SpanEnumeration<char>, ICUError>
|
|
GetLegacyKeywordValuesForLocale(const char* aLocale);
|
|
|
|
private:
|
|
/**
|
|
* Internal function to convert a legacy calendar identifier to the newer
|
|
* BCP 47 identifier.
|
|
*/
|
|
static SpanResult<char> LegacyIdentifierToBcp47(const char* aIdentifier,
|
|
int32_t aLength);
|
|
|
|
public:
|
|
enum class CommonlyUsed : bool {
|
|
/**
|
|
* Select all possible values, even when not commonly used by a locale.
|
|
*/
|
|
No,
|
|
|
|
/**
|
|
* Only select the values which are commonly used by a locale.
|
|
*/
|
|
Yes,
|
|
};
|
|
|
|
using Bcp47IdentifierEnumeration =
|
|
Enumeration<char, SpanResult<char>, Calendar::LegacyIdentifierToBcp47>;
|
|
|
|
/**
|
|
* Return BCP 47 Unicode locale extension type keywords.
|
|
*/
|
|
static Result<Bcp47IdentifierEnumeration, ICUError>
|
|
GetBcp47KeywordValuesForLocale(const char* aLocale,
|
|
CommonlyUsed aCommonlyUsed = CommonlyUsed::No);
|
|
|
|
~Calendar();
|
|
|
|
private:
|
|
friend class DateIntervalFormat;
|
|
UCalendar* GetUCalendar() const { return mCalendar; }
|
|
|
|
UCalendar* mCalendar = nullptr;
|
|
};
|
|
|
|
} // namespace mozilla::intl
|
|
|
|
#endif
|