mirror of
https://github.com/launchbadge/sqlx.git
synced 2025-10-02 15:25:32 +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 crate::types::{Json, Type};
|
||||||
use serde::{Deserialize, Serialize};
|
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>
|
// <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>
|
impl<'q, T> Encode<'q, Postgres> for Json<T>
|
||||||
where
|
where
|
||||||
T: Serialize,
|
T: Serialize,
|
||||||
|
@ -231,7 +231,7 @@ pub use time_tz::PgTimeTz;
|
|||||||
pub use record::{PgRecordDecoder, PgRecordEncoder};
|
pub use record::{PgRecordDecoder, PgRecordEncoder};
|
||||||
|
|
||||||
// Type::compatible impl appropriate for arrays
|
// 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
|
// we require the declared type to be an _array_ with an
|
||||||
// element type that is acceptable
|
// element type that is acceptable
|
||||||
if let PgTypeKind::Array(element) = &ty.kind() {
|
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
|
impl<'q, DB> Encode<'q, DB> for JsonValue
|
||||||
where
|
where
|
||||||
for<'a> Json<&'a Self>: Encode<'q, DB>,
|
for<'a> Json<&'a Self>: Encode<'q, DB>,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user