diff options
| author | Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> | 2025-08-27 08:34:16 +0300 |
|---|---|---|
| committer | Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> | 2025-08-27 08:34:16 +0300 |
| commit | 2f865926d6b0819fd7ad1c0e9be41b4c15916f0b (patch) | |
| tree | baf124deb8909ca694f3aec617007698f9a5c7a7 /lib | |
| parent | 4189b7c78bf7061616621e8edc503c828c996bd8 (diff) | |
labels: implement parse_delta_labels
Convenience function for parsing a series of delta labels; add tests as well.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/message/mu-labels.cc | 46 | ||||
| -rw-r--r-- | lib/message/mu-labels.hh | 12 |
2 files changed, 56 insertions, 2 deletions
diff --git a/lib/message/mu-labels.cc b/lib/message/mu-labels.cc index 39f7c62..6bcd938 100644 --- a/lib/message/mu-labels.cc +++ b/lib/message/mu-labels.cc @@ -100,6 +100,26 @@ Mu::Labels::parse_delta_label(const std::string &expr) } +Result<DeltaLabelVec> +Mu::Labels::parse_delta_labels(const std::string& exprs, + const std::string sepa) +{ + + DeltaLabelVec deltas{}; + for (const auto& expr: split(exprs, sepa)) { + if (auto delta = parse_delta_label(expr); !delta) + return Err(std::move(delta.error())); + else + deltas.emplace_back(*delta); + } + + return Ok(std::move(deltas)); +} + + + + + struct cmp_delta_label { // can not yet be a λ in C++17 bool operator()(const DeltaLabel& dl1, const DeltaLabel& dl2) const { return dl1.second < dl2.second; @@ -182,6 +202,29 @@ test_parse_delta_label() g_assert_false(!!parse_delta_label("-😨")); } + +static void +test_parse_delta_labels() +{ + { + const auto deltas = parse_delta_labels("+foo,-bar@cuux",","); + assert_valid_result(deltas); + + g_assert_true(deltas->at(0).first == Delta::Add); + assert_equal(deltas->at(0).second, "foo"); + + g_assert_true(deltas->at(1).first == Delta::Remove); + assert_equal(deltas->at(1).second, "bar@cuux"); + } + + { + const auto expr = parse_delta_labels("+foo @boo🐂", " "); + g_assert_false(!!expr); + } +} + + + static void test_validate_label() { @@ -229,18 +272,17 @@ test_updated_labels() assert_eq({}, delta_labels({"-fnorb", "-fnorb", "+whiteward", "+altesia", "+fnorb"}), {"altesia", "fnorb", "whiteward"}, delta_labels({"+altesia", "+fnorb", "+whiteward"})); - assert_eq({"piranesi", "hyperion", "mordor", "piranesi"}, delta_labels({}), {"hyperion", "mordor", "piranesi"}, delta_labels({})); } - int main(int argc, char* argv[]) { mu_test_init(&argc, &argv); g_test_add_func("/message/labels/parse-delta-label", test_parse_delta_label); + g_test_add_func("/message/labels/parse-delta-labels", test_parse_delta_labels); g_test_add_func("/message/labels/validate-label", test_validate_label); g_test_add_func("/message/labels/updated-labels", test_updated_labels); diff --git a/lib/message/mu-labels.hh b/lib/message/mu-labels.hh index 7971b96..85337f7 100644 --- a/lib/message/mu-labels.hh +++ b/lib/message/mu-labels.hh @@ -47,6 +47,18 @@ using DeltaLabelVec = std::vector<DeltaLabel>; Result<DeltaLabel> parse_delta_label(const std::string& expr); /** + * Parse a series of label expressions, with some separator + * + * This also validates the labels, as per valid_label() + * + * @param exprs label expressions + * + * @return a result with either a DeltaLabel or an error + */ +Result<DeltaLabelVec> parse_delta_labels(const std::string& exprs, + const std::string sepa); + +/** * Is the label (without +/- prefix) valid? * * @param label some label |
