From 1b6d23fad4eb452ecd529f940b9639fa45830fe3 Mon Sep 17 00:00:00 2001 From: Brett Date: Tue, 25 Feb 2025 02:14:19 -0500 Subject: [PATCH] more help --- CMakeLists.txt | 2 +- src/blt/parse/argparse_v2.cpp | 42 ++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b01aaf5..2807d26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.20) include(cmake/color.cmake) -set(BLT_VERSION 4.0.27) +set(BLT_VERSION 4.0.28) set(BLT_TARGET BLT) diff --git a/src/blt/parse/argparse_v2.cpp b/src/blt/parse/argparse_v2.cpp index ac7d6e2..1254909 100644 --- a/src/blt/parse/argparse_v2.cpp +++ b/src/blt/parse/argparse_v2.cpp @@ -186,13 +186,16 @@ namespace blt::argparse size_t aligned_size = 0; for (const auto& v : iterate(buffer).skip(start_index).take(take)) { - aligned_size = std::max(aligned_size, v.size()); + auto size = static_cast(v.size()); + for (; size > 0 && std::isblank(v[size - 1]); size--) + { + } + aligned_size = std::max(aligned_size, static_cast(size)); } + const auto offset_size = aligned_size + spaces_between; for (auto& v : iterate(buffer).skip(start_index).take(take)) { - auto offset_size = aligned_size + spaces_between; - for (size_t i = v.size(); i < offset_size; i++) v += ' '; } @@ -456,6 +459,35 @@ namespace blt::argparse auto& [builder, flag_list] = pair; str += builder->m_help.value_or(""); } + mark.align(4); + for (auto [str, pair] : mark.iter().zip(same_flags)) + { + auto& [builder, flag_list] = pair; + if (builder->m_default_value) + { + str += "(Default: "; + std::visit(detail::arg_meta_type_helper_t::make_visitor( + [&](auto& value) + { + str += value; + }, + [&](auto& vec) + { + if constexpr (!std::is_same_v>, std::vector>) + { + str += '['; + for (const auto& [i, v] : enumerate(vec)) + { + str += v; + if (i != vec.size() - 1) + str += ", "; + } + str += ']'; + } + }), *builder->m_default_value); + str += ")"; + } + } } std::cout << help.str() << std::endl; @@ -500,7 +532,7 @@ namespace blt::argparse for (const auto& [i, kv] : enumerate(compoundFlags)) { const auto& [name, builder] = kv; - aligner += '['; + aligner += builder->m_required ? '<' : '['; aligner += name.get_argument(); auto lambda = [&]() { @@ -527,7 +559,7 @@ namespace blt::argparse lambda(); } }, builder->m_nargs); - aligner += ']'; + aligner += builder->m_required ? '>' : ']'; aligner += ' '; }