更完
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user