2022-04-01 17:34:47 +01:00
/*
* 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>
2023-02-09 03:02:46 +01:00
ErrorOr < void > generate_header_file ( JsonArray & identifier_data , Core : : File & file ) ;
ErrorOr < void > generate_implementation_file ( JsonArray & identifier_data , Core : : File & file ) ;
2022-04-01 17:34:47 +01:00
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 ( ) ;
2023-02-09 03:02:46 +01:00
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 ) ) ;
2022-04-01 17:34:47 +01:00
TRY ( generate_header_file ( identifier_data , * generated_header_file ) ) ;
TRY ( generate_implementation_file ( identifier_data , * generated_implementation_file ) ) ;
return 0 ;
}
2023-02-09 03:02:46 +01:00
ErrorOr < void > generate_header_file ( JsonArray & identifier_data , Core : : File & file )
2022-04-01 17:34:47 +01:00
{
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 ( ) ;
2022-12-06 01:12:49 +00:00
member_generator . set ( " name:titlecase " , title_casify ( name . to_deprecated_string ( ) ) ) ;
2022-04-01 17:34:47 +01:00
member_generator . append ( R " ~~~(
@ name : titlecase @ ,
) ~ ~ ~ " );
} ) ;
generator . append ( R " ~~~(
} ;
ValueID value_id_from_string ( StringView ) ;
2023-01-06 19:02:26 +01:00
StringView string_from_value_id ( ValueID ) ;
2022-04-01 17:34:47 +01:00
}
) ~ ~ ~ " );
2023-02-24 22:38:01 +01:00
// FIXME: This should write the entire span.
TRY ( file . write_some ( generator . as_string_view ( ) . bytes ( ) ) ) ;
2022-04-01 17:34:47 +01:00
return { } ;
}
2023-02-09 03:02:46 +01:00
ErrorOr < void > generate_implementation_file ( JsonArray & identifier_data , Core : : File & file )
2022-04-01 17:34:47 +01:00
{
StringBuilder builder ;
SourceGenerator generator { builder } ;
generator . append ( R " ~~~(
# include <AK/Assertions.h>
2023-01-09 19:08:37 +01:00
# include <AK/HashMap.h>
2022-04-01 17:34:47 +01:00
# include <LibWeb/CSS/ValueID.h>
namespace Web : : CSS {
2023-01-09 19:08:37 +01:00
HashMap < StringView , ValueID , AK : : CaseInsensitiveStringViewTraits > g_stringview_to_value_id_map {
2022-04-01 17:34:47 +01:00
) ~ ~ ~ " );
identifier_data . for_each ( [ & ] ( auto & name ) {
auto member_generator = generator . fork ( ) ;
2022-12-06 01:12:49 +00:00
member_generator . set ( " name " , name . to_deprecated_string ( ) ) ;
member_generator . set ( " name:titlecase " , title_casify ( name . to_deprecated_string ( ) ) ) ;
2022-04-01 17:34:47 +01:00
member_generator . append ( R " ~~~(
2023-01-09 19:08:37 +01:00
{ " @name@ " sv , ValueID : : @ name : titlecase @ } ,
2022-04-01 17:34:47 +01:00
) ~ ~ ~ " );
} ) ;
generator . append ( R " ~~~(
2023-01-09 19:08:37 +01:00
} ;
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 ) ;
2022-04-01 17:34:47 +01:00
}
2023-01-06 19:02:26 +01:00
StringView string_from_value_id ( ValueID value_id ) {
2022-04-01 17:34:47 +01:00
switch ( value_id ) {
) ~ ~ ~ " );
identifier_data . for_each ( [ & ] ( auto & name ) {
auto member_generator = generator . fork ( ) ;
2022-12-06 01:12:49 +00:00
member_generator . set ( " name " , name . to_deprecated_string ( ) ) ;
member_generator . set ( " name:titlecase " , title_casify ( name . to_deprecated_string ( ) ) ) ;
2022-04-01 17:34:47 +01:00
member_generator . append ( R " ~~~(
case ValueID : : @ name : titlecase @ :
2023-01-06 19:02:26 +01:00
return " @name@ " sv ;
2022-04-01 17:34:47 +01:00
) ~ ~ ~ " );
} ) ;
generator . append ( R " ~~~(
default :
2023-01-06 19:02:26 +01:00
return " (invalid CSS::ValueID) " sv ;
2022-04-01 17:34:47 +01:00
}
}
} // namespace Web::CSS
) ~ ~ ~ " );
2023-02-24 22:38:01 +01:00
// FIXME: This should write the entire span.
TRY ( file . write_some ( generator . as_string_view ( ) . bytes ( ) ) ) ;
2022-04-01 17:34:47 +01:00
return { } ;
}