1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 07:44:59 +00:00
serenity/Userland/Utilities/gml-format.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

70 lines
2.2 KiB
C++

/*
* Copyright (c) 2021, Linus Groh <linusg@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibCore/ArgsParser.h>
#include <LibCore/File.h>
#include <LibCore/System.h>
#include <LibGUI/GML/Formatter.h>
#include <LibMain/Main.h>
static ErrorOr<bool> format_file(StringView path, bool inplace)
{
auto read_from_stdin = path == "-";
auto open_mode = (inplace && !read_from_stdin) ? Core::File::OpenMode::ReadWrite : Core::File::OpenMode::Read;
auto file = TRY(Core::File::open_file_or_standard_stream(path, open_mode));
auto contents = TRY(file->read_until_eof());
auto formatted_gml_or_error = GUI::GML::format_gml(contents);
if (formatted_gml_or_error.is_error()) {
warnln("Failed to parse GML: {}", formatted_gml_or_error.error());
return false;
}
auto formatted_gml = formatted_gml_or_error.release_value();
if (inplace && !read_from_stdin) {
if (formatted_gml == contents)
return true;
TRY(file->seek(0, SeekMode::SetPosition));
TRY(file->truncate(0));
// FIXME: This should write the entire span.
TRY(file->write_some(formatted_gml.bytes()));
} else {
out("{}", formatted_gml);
}
return formatted_gml == contents;
}
ErrorOr<int> serenity_main(Main::Arguments args)
{
TRY(Core::System::pledge("stdio rpath wpath cpath"));
bool inplace = false;
Vector<DeprecatedString> files;
Core::ArgsParser args_parser;
args_parser.set_general_help("Format GML files.");
args_parser.add_option(inplace, "Write formatted contents back to file rather than standard output", "inplace", 'i');
args_parser.add_positional_argument(files, "File(s) to process", "path", Core::ArgsParser::Required::No);
args_parser.parse(args);
if (!inplace)
TRY(Core::System::pledge("stdio rpath"));
if (files.is_empty())
files.append("-");
auto formatting_changed = false;
for (auto& file : files) {
if (!TRY(format_file(file, inplace)))
formatting_changed = true;
}
if (formatting_changed) {
dbgln("Some GML formatting issues were encountered.");
return 1;
}
return 0;
}