Skip to content

Commit

Permalink
LibTimeZone: Add method to convert a time zone to a string
Browse files Browse the repository at this point in the history
  • Loading branch information
trflynn89 authored and linusg committed Jan 10, 2022
1 parent 14535fb commit 1c2c98a
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ static void generate_time_zone_data_implementation(Core::File& file, TimeZoneDat
namespace TimeZone {
)~~~");

auto append_from_string = [&](StringView enum_title, StringView enum_snake, auto const& values, auto const& aliases) {
auto append_string_conversions = [&](StringView enum_title, StringView enum_snake, auto const& values, auto const& aliases) {
HashValueMap<String> hashes;
hashes.ensure_capacity(values.size());

Expand All @@ -248,9 +248,10 @@ namespace TimeZone {
options.sensitivity = CaseSensitivity::CaseInsensitive;

generate_value_from_string(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes), options);
generate_value_to_string(generator, "{}_to_string"sv, enum_title, enum_snake, format_identifier, values);
};

append_from_string("TimeZone"sv, "time_zone"sv, time_zone_data.time_zone_names, time_zone_data.time_zone_aliases);
append_string_conversions("TimeZone"sv, "time_zone"sv, time_zone_data.time_zone_names, time_zone_data.time_zone_aliases);

generator.append(R"~~~(
}
Expand Down
30 changes: 30 additions & 0 deletions Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,36 @@ Optional<@return_type@> @method_name@(StringView key)
)~~~");
}

template<typename IdentifierFormatter>
void generate_value_to_string(SourceGenerator& generator, StringView method_name_format, StringView value_type, StringView value_name, IdentifierFormatter&& format_identifier, Span<String const> values)
{
generator.set("method_name", String::formatted(method_name_format, value_name));
generator.set("value_type", value_type);
generator.set("value_name", value_name);

generator.append(R"~~~(
StringView @method_name@(@value_type@ @value_name@)
{
using enum @value_type@;
switch (@value_name@) {)~~~");

for (auto const& value : values) {
generator.set("enum_value", format_identifier(value_type, value));
generator.set("string_value", value);
generator.append(R"~~~(
case @enum_value@:
return "@string_value@"sv;)~~~");
}

generator.append(R"~~~(
}
VERIFY_NOT_REACHED();
}
)~~~");
}

template<typename IdentifierFormatter>
void generate_enum(SourceGenerator& generator, IdentifierFormatter&& format_identifier, StringView name, StringView default_, Vector<String>& values, Vector<Alias> aliases = {})
{
Expand Down
16 changes: 16 additions & 0 deletions Tests/LibTimeZone/TestTimeZone.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,20 @@ TEST_CASE(case_insensitive_time_zone_from_string)
EXPECT_EQ(TimeZone::time_zone_from_string("uTc"sv), TimeZone::TimeZone::UTC);
}

TEST_CASE(time_zone_to_string)
{
EXPECT_EQ(TimeZone::time_zone_to_string(TimeZone::TimeZone::America_New_York), "America/New_York"sv);
EXPECT_EQ(TimeZone::time_zone_to_string(TimeZone::TimeZone::Europe_Paris), "Europe/Paris"sv);
EXPECT_EQ(TimeZone::time_zone_to_string(TimeZone::TimeZone::Etc_GMT_Ahead_2), "Etc/GMT+2"sv);
EXPECT_EQ(TimeZone::time_zone_to_string(TimeZone::TimeZone::Etc_GMT_Behind_5), "Etc/GMT-5"sv);
}

TEST_CASE(time_zone_to_string_link)
{
EXPECT_EQ(TimeZone::time_zone_to_string(TimeZone::TimeZone::Etc_UTC), "Etc/UTC"sv);
EXPECT_EQ(TimeZone::time_zone_to_string(TimeZone::TimeZone::UTC), "Etc/UTC"sv);
EXPECT_EQ(TimeZone::time_zone_to_string(TimeZone::TimeZone::Universal), "Etc/UTC"sv);
EXPECT_EQ(TimeZone::time_zone_to_string(TimeZone::TimeZone::Etc_Universal), "Etc/UTC"sv);
}

#endif
1 change: 1 addition & 0 deletions Userland/Libraries/LibTimeZone/TimeZone.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
namespace TimeZone {

Optional<TimeZone> __attribute__((weak)) time_zone_from_string(StringView) { return {}; }
StringView __attribute__((weak)) time_zone_to_string(TimeZone) { return {}; }

}
1 change: 1 addition & 0 deletions Userland/Libraries/LibTimeZone/TimeZone.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@
namespace TimeZone {

Optional<TimeZone> time_zone_from_string(StringView time_zone);
StringView time_zone_to_string(TimeZone time_zone);

}

0 comments on commit 1c2c98a

Please sign in to comment.