Skip to content

Commit 6130e6c

Browse files
committed
Better default value name hint for vector flags
These look like "--instance-name=NAME[,NAME...]" now Assisted-by: Gemini
1 parent 7ee69a7 commit 6130e6c

4 files changed

Lines changed: 48 additions & 5 deletions

File tree

base/cvd/cuttlefish/flag_parser/flag.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ const std::string& Flag::Description() const { return help_; }
144144

145145
std::string Flag::CurrentValue() const { return getter_(); }
146146

147+
const std::string& Flag::ValueNameHint() const { return value_name_hint_; }
148+
147149
Flag::Flag(std::string name, Flag::Style style) : style_(style) {
148150
ValidateAlias(name);
149151
value_name_hint_ = DefaultValueNameHint(name);

base/cvd/cuttlefish/flag_parser/flag.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class Flag {
6262
std::string Synopsis() const;
6363
const std::string& Description() const;
6464
std::string CurrentValue() const;
65+
const std::string& ValueNameHint() const;
6566

6667
private:
6768
enum class Style {

base/cvd/cuttlefish/flag_parser/gflags_compat.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@
2626
#include <string>
2727
#include <string_view>
2828
#include <type_traits>
29+
#include <utility>
2930
#include <vector>
3031

3132
#include "absl/log/log.h"
3233
#include "absl/strings/numbers.h"
34+
#include "absl/strings/str_cat.h"
3335
#include "absl/strings/str_join.h"
3436
#include "absl/strings/str_replace.h"
3537
#include "absl/strings/str_split.h"
@@ -202,6 +204,11 @@ std::string XmlEscape(const std::string& s) {
202204
return absl::StrReplaceAll(s, {{"<", "&lt;"}, {">", "&gt;"}});
203205
}
204206

207+
Flag WithVectorNameValueHint(Flag flag) {
208+
std::string hint = flag.ValueNameHint();
209+
return std::move(flag).ValueNameHint(absl::StrCat(hint, "[,", hint, "...]"));
210+
}
211+
205212
} // namespace
206213

207214
void WriteGflagsCompatXml(const Flag& flag, std::ostream& out) {
@@ -299,16 +306,19 @@ Flag GflagsCompatFlag(const std::string& name, bool& value) {
299306

300307
Flag GflagsCompatFlag(const std::string& name,
301308
std::vector<std::string>& value) {
302-
return GflagsCompatFlagImpl<std::string>(name, value, "");
309+
return WithVectorNameValueHint(
310+
GflagsCompatFlagImpl<std::string>(name, value, ""));
303311
}
304312

305313
Flag GflagsCompatFlag(const std::string& name, std::vector<unsigned>& value) {
306-
return GflagsCompatFlagImpl<unsigned>(name, value, 0);
314+
return WithVectorNameValueHint(
315+
GflagsCompatFlagImpl<unsigned>(name, value, 0));
307316
}
308317

309318
Flag GflagsCompatFlag(const std::string& name, std::vector<bool>& value,
310319
const bool default_value) {
311-
return GflagsCompatFlagImpl(name, value, default_value);
320+
return WithVectorNameValueHint(
321+
GflagsCompatFlagImpl(name, value, default_value));
312322
}
313323

314324
Flag GflagsCompatFlag(const std::string& name,
@@ -351,13 +361,13 @@ Flag GflagsCompatFlag(const std::string& name, std::optional<bool>& value,
351361
Flag GflagsCompatFlag(const std::string& name,
352362
std::optional<std::vector<std::string>>& value,
353363
CoerceToNullopt opt) {
354-
return GflagsCompatFlagImpl(name, value, opt);
364+
return WithVectorNameValueHint(GflagsCompatFlagImpl(name, value, opt));
355365
}
356366

357367
Flag GflagsCompatFlag(const std::string& name,
358368
std::optional<std::vector<unsigned>>& value,
359369
CoerceToNullopt opt) {
360-
return GflagsCompatFlagImpl(name, value, opt);
370+
return WithVectorNameValueHint(GflagsCompatFlagImpl(name, value, opt));
361371
}
362372

363373
} // namespace cuttlefish

base/cvd/cuttlefish/flag_parser/gflags_compat_test.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,4 +561,34 @@ TEST(FlagParser, OptionalInt64Flag_NotPresent) {
561561
ASSERT_FALSE(value.has_value());
562562
}
563563

564+
TEST(FlagParser, VectorFlagValueNameHint_StringVector) {
565+
std::vector<std::string> string_vec;
566+
auto flag = GflagsCompatFlag("string-vec", string_vec);
567+
EXPECT_EQ(flag.Synopsis(), "--string-vec=VEC[,VEC...]");
568+
}
569+
570+
TEST(FlagParser, VectorFlagValueNameHint_UnsignedVector) {
571+
std::vector<unsigned> unsigned_vec;
572+
auto flag = GflagsCompatFlag("unsigned-vec", unsigned_vec);
573+
EXPECT_EQ(flag.Synopsis(), "--unsigned-vec=VEC[,VEC...]");
574+
}
575+
576+
TEST(FlagParser, VectorFlagValueNameHint_BoolVector) {
577+
std::vector<bool> bool_vec;
578+
auto flag = GflagsCompatFlag("bool-vec", bool_vec, true);
579+
EXPECT_EQ(flag.Synopsis(), "--bool-vec=VEC[,VEC...]");
580+
}
581+
582+
TEST(FlagParser, VectorFlagValueNameHint_OptionalStringVector) {
583+
std::optional<std::vector<std::string>> opt_string_vec;
584+
auto flag = GflagsCompatFlag("opt-string-vec", opt_string_vec);
585+
EXPECT_EQ(flag.Synopsis(), "--opt-string-vec=VEC[,VEC...]");
586+
}
587+
588+
TEST(FlagParser, VectorFlagValueNameHint_OptionalUnsignedVector) {
589+
std::optional<std::vector<unsigned>> opt_unsigned_vec;
590+
auto flag = GflagsCompatFlag("opt-unsigned-vec", opt_unsigned_vec);
591+
EXPECT_EQ(flag.Synopsis(), "--opt-unsigned-vec=VEC[,VEC...]");
592+
}
593+
564594
} // namespace cuttlefish

0 commit comments

Comments
 (0)