diff --git a/Base/usr/share/man/man1/config.md b/Base/usr/share/man/man1/config.md index c0ee0c21568..cbeb45cef4a 100644 --- a/Base/usr/share/man/man1/config.md +++ b/Base/usr/share/man/man1/config.md @@ -5,7 +5,7 @@ config ## Synopsis ```sh -$ config [--remove] [key] [value] +$ config [--remove] [group] [key] [value] ``` ## Description diff --git a/Userland/Utilities/config.cpp b/Userland/Utilities/config.cpp index c06081c3343..b9c5c215e46 100644 --- a/Userland/Utilities/config.cpp +++ b/Userland/Utilities/config.cpp @@ -4,11 +4,25 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include #include +static void print_group(StringView domain, StringView group) +{ + auto keys = Config::Client::the().list_keys(domain, group); + quick_sort(keys); + for (auto const& key : keys) { + auto value = Config::Client::the().read_string_value(domain, group, key); + if (!value.has_value()) + warnln("Can't find a value for {}:{}:{}", domain, group, key); + else + outln("{}={}", key, *value); + } +} + ErrorOr serenity_main(Main::Arguments arguments) { Core::EventLoop loop; @@ -22,24 +36,42 @@ ErrorOr serenity_main(Main::Arguments arguments) args_parser.set_general_help("Show or modify values in the configuration files through ConfigServer."); args_parser.add_option(remove, "Remove group or key", "remove", 'r'); args_parser.add_positional_argument(domain, "Config domain", "domain"); - args_parser.add_positional_argument(group, "Group name", "group"); + args_parser.add_positional_argument(group, "Group name", "group", Core::ArgsParser::Required::No); args_parser.add_positional_argument(key, "Key name", "key", Core::ArgsParser::Required::No); args_parser.add_positional_argument(value_to_write, "Value to write", "value", Core::ArgsParser::Required::No); args_parser.parse(arguments); if (remove) { - if (!key.is_empty()) - Config::remove_key(domain, group, key); - else + if (group.is_empty()) + return Error::from_string_literal("Can't delete a domain"); + if (key.is_empty()) Config::remove_group(domain, group); + else + Config::remove_key(domain, group, key); return 0; } - if (!key.is_empty() && !value_to_write.is_empty()) { + if (!group.is_empty() && !key.is_empty() && !value_to_write.is_empty()) { Config::write_string(domain, group, key, value_to_write); return 0; } + if (group.is_empty()) { + auto groups = Config::Client::the().list_groups(domain); + quick_sort(groups); + + for (auto const& group : groups) { + outln("[{}]", group); + print_group(domain, group); + } + return 0; + } + + if (key.is_empty()) { + print_group(domain, group); + return 0; + } + auto value_or_error = Config::Client::the().read_string_value(domain, group, key); if (!value_or_error.has_value()) return 1;