1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:17:46 +00:00

LibGUI: Introduce property deserializers for GML property values

This commit is contained in:
Dan Klishch 2023-11-05 18:44:15 -05:00 committed by Andrew Kaster
parent fb6a9dd2f5
commit 1689ec9100
4 changed files with 186 additions and 0 deletions

View file

@ -9,6 +9,7 @@
#include <LibCore/EventReceiver.h>
#include <LibGUI/Forward.h>
#include <LibGUI/Property.h>
#include <LibGUI/PropertyDeserializer.h>
namespace GUI {
@ -59,6 +60,43 @@ protected:
void register_property(ByteString const& name, Function<JsonValue()> getter, Function<bool(JsonValue const&)> setter = nullptr);
template<typename Getter, typename Deserializer, typename Setter>
void register_property(StringView name, Getter&& getter, Deserializer&& deserializer, Setter&& setter)
{
Function<JsonValue()> getter_fn = nullptr;
Function<bool(JsonValue const&)> setter_fn = nullptr;
if constexpr (!SameAs<Getter, nullptr_t>) {
static_assert(ConvertibleTo<InvokeResult<Getter>, JsonValue>);
getter_fn = [captured_getter = forward<Getter>(getter)]() -> JsonValue {
return captured_getter();
};
}
static_assert(SameAs<Deserializer, nullptr_t> == SameAs<Setter, nullptr_t>);
if constexpr (!SameAs<Deserializer, nullptr_t>) {
using DeserializerReturnValue = RemoveReference<InvokeResult<Deserializer, JsonValue const&>>;
static_assert(SpecializationOf<DeserializerReturnValue, ErrorOr>);
using DeserializedValue = RemoveReference<typename DeserializerReturnValue::ResultType>;
// FIXME: Should we allow setter to fail?
static_assert(SameAs<InvokeResult<Setter, DeserializedValue&&>, void>);
setter_fn = [captured_deserializer = forward<Deserializer>(deserializer), captured_setter = forward<Setter>(setter)](JsonValue const& value) -> bool {
DeserializerReturnValue deserializer_return_value = captured_deserializer(value);
if (deserializer_return_value.is_error()) {
// FIXME: Propagate error up to a place where we have enough context to print/show meaningful message.
dbgln("Got error while deserializing GML property: {}", deserializer_return_value.error());
return false;
}
DeserializedValue deserialized_value = deserializer_return_value.release_value();
captured_setter(move(deserialized_value));
return true;
};
}
register_property(name, move(getter_fn), move(setter_fn));
}
private:
HashMap<ByteString, NonnullOwnPtr<Property>> m_properties;
};