summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDirk-Jan C. Binnema <djcb@djcbsoftware.nl>2025-08-27 08:34:16 +0300
committerDirk-Jan C. Binnema <djcb@djcbsoftware.nl>2025-08-27 08:34:16 +0300
commit2f865926d6b0819fd7ad1c0e9be41b4c15916f0b (patch)
treebaf124deb8909ca694f3aec617007698f9a5c7a7 /lib
parent4189b7c78bf7061616621e8edc503c828c996bd8 (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.cc46
-rw-r--r--lib/message/mu-labels.hh12
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