This commit is contained in:
2026-08-12 01:44:13 +08:00
parent 3b4d509d43
commit 4f2ec40922
6 changed files with 180 additions and 54 deletions
+35 -1
View File
@@ -100,6 +100,9 @@ template <class T>
concept Writable_Adapted_Object = Snapshot_Adapted_Object<T> && Object_Adapter_With_Commit<T>;
template <class T>
concept Creatable_Writable_Object = Writable_Adapted_Object<T> && Object_Adapter_With_Create<T>;
template <class T>
concept Direct_Described_Object = Described_Type<std::remove_cvref_t<T>> &&
(!Writable_Adapted_Object<T>);
template <Json_Type Json, class T>
requires Described_Type<Object_Model_Type<T>>
Json to_descriptor_json();
@@ -114,6 +117,8 @@ requires (Described_Type<std::remove_cvref_t<T>> || Object_Adapter_With_Snapshot
Json to_frontend_json(const T& value);
template <Json_Type Json, Writable_Adapted_Object T>
Update_Result assign_json(T& target, const Json& value);
template <Json_Type Json, Direct_Described_Object T>
Update_Result assign_json(T& target, const Json& value);
template <Json_Type Json, Writable_Adapted_Object T>
Update_Result apply_object_json(T& target, const Json& value, Write_Mode mode, bool complete);
template <Json_Type Json, class T>
@@ -583,7 +588,20 @@ Update_Result apply_model_json(Model& candidate, const Json& value, Write_Mode m
return;
}
try {
assign_json_value<Json>(item.get(candidate), Json_Adapter<Json>::at(value, item.name()), Write_Context{mode, complete});
using Field = std::remove_cvref_t<decltype(item)>;
using Field_Value = typename Field::member_type;
if constexpr(std::is_lvalue_reference_v<decltype(item.get(candidate))> &&
!std::is_const_v<std::remove_reference_t<decltype(item.get(candidate))>>) {
assign_json_value<Json>(item.get(candidate),
Json_Adapter<Json>::at(value, item.name()),
Write_Context{mode, complete});
} else {
Field_Value field_candidate(item.get(std::as_const(candidate)));
assign_json_value<Json>(field_candidate,
Json_Adapter<Json>::at(value, item.name()),
Write_Context{mode, complete});
item.set(candidate, std::move(field_candidate));
}
} catch(const Json_Assignment_Error& error) {
merge_update_errors(result, error.result(), item.name());
} catch(const Field_Validation_Error& error) {
@@ -711,6 +729,22 @@ template <Json_Type Json, Writable_Adapted_Object T>
Update_Result apply_patch(T& target, const Json& patch) {
return apply_frontend_patch<Json>(target, patch);
}
template <Json_Type Json, Direct_Described_Object T>
Update_Result assign_json(T& target, const Json& value) {
return apply_model_json<Json>(target, value, Write_Mode::internal, true);
}
template <Json_Type Json, Direct_Described_Object T>
Update_Result apply_json_patch(T& target, const Json& patch) {
return apply_model_json<Json>(target, patch, Write_Mode::internal, false);
}
template <Json_Type Json, Direct_Described_Object T>
Update_Result apply_frontend_patch(T& target, const Json& patch) {
return apply_model_json<Json>(target, patch, Write_Mode::update, false);
}
template <Json_Type Json, Direct_Described_Object T>
Update_Result apply_patch(T& target, const Json& patch) {
return apply_frontend_patch<Json>(target, patch);
}
template <Json_Type Json, Managed_Value_Type T>
requires Writable_Adapted_Object<typename std::remove_cvref_t<T>::value_type>
Update_Result assign_json(T& target, const Json& value) {