1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 07:14:58 +00:00
serenity/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSValueID.cpp
Tim Schumacher d5871f5717 AK: Rename Stream::{read,write} to Stream::{read_some,write_some}
Similar to POSIX read, the basic read and write functions of AK::Stream
do not have a lower limit of how much data they read or write (apart
from "none at all").

Rename the functions to "read some [data]" and "write some [data]" (with
"data" being omitted, since everything here is reading and writing data)
to make them sufficiently distinct from the functions that ensure to
use the entire buffer (which should be the go-to function for most
usages).

No functional changes, just a lot of new FIXMEs.
2023-03-13 15:16:20 +00:00

141 lines
4.2 KiB
C++

/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "GeneratorUtil.h"
#include <AK/SourceGenerator.h>
#include <AK/StringBuilder.h>
#include <LibCore/ArgsParser.h>
#include <LibMain/Main.h>
ErrorOr<void> generate_header_file(JsonArray& identifier_data, Core::File& file);
ErrorOr<void> generate_implementation_file(JsonArray& identifier_data, Core::File& file);
ErrorOr<int> serenity_main(Main::Arguments arguments)
{
StringView generated_header_path;
StringView generated_implementation_path;
StringView identifiers_json_path;
Core::ArgsParser args_parser;
args_parser.add_option(generated_header_path, "Path to the ValueID header file to generate", "generated-header-path", 'h', "generated-header-path");
args_parser.add_option(generated_implementation_path, "Path to the ValueID implementation file to generate", "generated-implementation-path", 'c', "generated-implementation-path");
args_parser.add_option(identifiers_json_path, "Path to the JSON file to read from", "json-path", 'j', "json-path");
args_parser.parse(arguments);
auto json = TRY(read_entire_file_as_json(identifiers_json_path));
VERIFY(json.is_array());
auto identifier_data = json.as_array();
auto generated_header_file = TRY(Core::File::open(generated_header_path, Core::File::OpenMode::Write));
auto generated_implementation_file = TRY(Core::File::open(generated_implementation_path, Core::File::OpenMode::Write));
TRY(generate_header_file(identifier_data, *generated_header_file));
TRY(generate_implementation_file(identifier_data, *generated_implementation_file));
return 0;
}
ErrorOr<void> generate_header_file(JsonArray& identifier_data, Core::File& file)
{
StringBuilder builder;
SourceGenerator generator { builder };
generator.append(R"~~~(
#pragma once
#include <AK/StringView.h>
#include <AK/Traits.h>
namespace Web::CSS {
enum class ValueID {
Invalid,
)~~~");
identifier_data.for_each([&](auto& name) {
auto member_generator = generator.fork();
member_generator.set("name:titlecase", title_casify(name.to_deprecated_string()));
member_generator.append(R"~~~(
@name:titlecase@,
)~~~");
});
generator.append(R"~~~(
};
ValueID value_id_from_string(StringView);
StringView string_from_value_id(ValueID);
}
)~~~");
// FIXME: This should write the entire span.
TRY(file.write_some(generator.as_string_view().bytes()));
return {};
}
ErrorOr<void> generate_implementation_file(JsonArray& identifier_data, Core::File& file)
{
StringBuilder builder;
SourceGenerator generator { builder };
generator.append(R"~~~(
#include <AK/Assertions.h>
#include <AK/HashMap.h>
#include <LibWeb/CSS/ValueID.h>
namespace Web::CSS {
HashMap<StringView, ValueID, AK::CaseInsensitiveStringViewTraits> g_stringview_to_value_id_map {
)~~~");
identifier_data.for_each([&](auto& name) {
auto member_generator = generator.fork();
member_generator.set("name", name.to_deprecated_string());
member_generator.set("name:titlecase", title_casify(name.to_deprecated_string()));
member_generator.append(R"~~~(
{"@name@"sv, ValueID::@name:titlecase@},
)~~~");
});
generator.append(R"~~~(
};
ValueID value_id_from_string(StringView string)
{
auto maybe_value_id = g_stringview_to_value_id_map.get(string);
return maybe_value_id.value_or(ValueID::Invalid);
}
StringView string_from_value_id(ValueID value_id) {
switch (value_id) {
)~~~");
identifier_data.for_each([&](auto& name) {
auto member_generator = generator.fork();
member_generator.set("name", name.to_deprecated_string());
member_generator.set("name:titlecase", title_casify(name.to_deprecated_string()));
member_generator.append(R"~~~(
case ValueID::@name:titlecase@:
return "@name@"sv;
)~~~");
});
generator.append(R"~~~(
default:
return "(invalid CSS::ValueID)"sv;
}
}
} // namespace Web::CSS
)~~~");
// FIXME: This should write the entire span.
TRY(file.write_some(generator.as_string_view().bytes()));
return {};
}