Impl PgHasArrayType for serde_json::{Value,RawValue} (#1722)

* Implement PgHasArrayType for JSON types in the serde_json crate

* Remove redundant Type impls for arrays and Vecs of JsonValue

* Relax an implicit Sized bound to support JsonRawValue
This commit is contained in:
Andre B. Reis 2022-02-23 20:57:48 +00:00 committed by GitHub
parent cc35809708
commit 99d3220d88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 29 deletions

View File

@ -7,6 +7,8 @@ use crate::postgres::{
};
use crate::types::{Json, Type};
use serde::{Deserialize, Serialize};
use serde_json::value::RawValue as JsonRawValue;
use serde_json::Value as JsonValue;
// <https://www.postgresql.org/docs/12/datatype-json.html>
@ -34,6 +36,26 @@ impl<T> PgHasArrayType for Json<T> {
}
}
impl PgHasArrayType for JsonValue {
fn array_type_info() -> PgTypeInfo {
PgTypeInfo::JSONB_ARRAY
}
fn array_compatible(ty: &PgTypeInfo) -> bool {
array_compatible::<JsonValue>(ty)
}
}
impl PgHasArrayType for JsonRawValue {
fn array_type_info() -> PgTypeInfo {
PgTypeInfo::JSONB_ARRAY
}
fn array_compatible(ty: &PgTypeInfo) -> bool {
array_compatible::<JsonRawValue>(ty)
}
}
impl<'q, T> Encode<'q, Postgres> for Json<T>
where
T: Serialize,

View File

@ -231,7 +231,7 @@ pub use time_tz::PgTimeTz;
pub use record::{PgRecordDecoder, PgRecordEncoder};
// Type::compatible impl appropriate for arrays
fn array_compatible<E: Type<Postgres>>(ty: &PgTypeInfo) -> bool {
fn array_compatible<E: Type<Postgres> + ?Sized>(ty: &PgTypeInfo) -> bool {
// we require the declared type to be an _array_ with an
// element type that is acceptable
if let PgTypeKind::Array(element) = &ty.kind() {

View File

@ -56,34 +56,6 @@ where
}
}
impl<DB> Type<DB> for Vec<JsonValue>
where
Vec<Json<JsonValue>>: Type<DB>,
DB: Database,
{
fn type_info() -> DB::TypeInfo {
<Vec<Json<JsonValue>> as Type<DB>>::type_info()
}
fn compatible(ty: &DB::TypeInfo) -> bool {
<Vec<Json<JsonValue>> as Type<DB>>::compatible(ty)
}
}
impl<DB> Type<DB> for [JsonValue]
where
[Json<JsonValue>]: Type<DB>,
DB: Database,
{
fn type_info() -> DB::TypeInfo {
<[Json<JsonValue>] as Type<DB>>::type_info()
}
fn compatible(ty: &DB::TypeInfo) -> bool {
<[Json<JsonValue>] as Type<DB>>::compatible(ty)
}
}
impl<'q, DB> Encode<'q, DB> for JsonValue
where
for<'a> Json<&'a Self>: Encode<'q, DB>,