mirror of
https://github.com/launchbadge/sqlx.git
synced 2025-09-30 14:32:23 +00:00
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:
parent
cc35809708
commit
99d3220d88
@ -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,
|
||||
|
@ -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() {
|
||||
|
@ -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>,
|
||||
|
Loading…
x
Reference in New Issue
Block a user