refactor: add serializer::contains()

This commit is contained in:
Charles Kerr
2026-01-04 09:45:24 -06:00
parent 8d904ce9df
commit 4f981a3f0d
2 changed files with 33 additions and 0 deletions

View File

@@ -383,6 +383,20 @@ bool set_if_changed(T& tgt, Fields const& fields, Key const key, Value val)
return key_found && changed;
}
/**
* Check whether a key exists in a `fields` tuple.
*/
template<typename Fields, typename Key>
[[nodiscard]] bool constexpr contains(Fields const& fields, Key const key)
{
if constexpr (std::tuple_size_v<detail::remove_cvref_t<Fields>> == 0)
{
return false;
}
return std::apply([key](auto const&... field) { return ((field.key == key) || ...); }, fields);
}
/**
* Get a field's value.
*

View File

@@ -297,6 +297,7 @@ TEST_F(SerializerTest, optionalRejectsWrongType)
// ---
using libtransmission::serializer::contains;
using libtransmission::serializer::Field;
using libtransmission::serializer::get_value;
using libtransmission::serializer::load;
@@ -475,6 +476,24 @@ TEST_F(SerializerTest, setFloatScaled)
EXPECT_DOUBLE_EQ(thing.d, val);
}
TEST_F(SerializerTest, containsMissingKey)
{
EXPECT_FALSE(contains(Thing::Fields, TR_KEY_address));
}
TEST_F(SerializerTest, containsOk)
{
EXPECT_TRUE(contains(Thing::Fields, TR_KEY_port));
EXPECT_TRUE(contains(Thing::Fields, TR_KEY_alt_speed_up));
EXPECT_TRUE(contains(Thing::Fields, TR_KEY_name));
}
TEST_F(SerializerTest, containsEmptyFields)
{
static constexpr auto Empty = std::tuple{};
EXPECT_FALSE(contains(Empty, TR_KEY_name));
}
TEST_F(SerializerTest, getMissingKey)
{
auto thing = Thing{};