Skip to content

Commit f95f06d

Browse files
authored
Merge pull request #4229 from aznszn/add_to_json
added `to_json` function
2 parents 576f3cf + df57cf5 commit f95f06d

File tree

4 files changed

+69
-3
lines changed

4 files changed

+69
-3
lines changed

diesel/src/pg/expression/expression_methods.rs

+16-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
pub(in crate::pg) use self::private::{
44
ArrayOrNullableArray, InetOrCidr, JsonIndex, JsonOrNullableJsonOrJsonbOrNullableJsonb,
5-
JsonRemoveIndex, JsonbOrNullableJsonb, MultirangeOrNullableMultirange,
5+
JsonRemoveIndex, JsonbOrNullableJsonb, MaybeNullableValue, MultirangeOrNullableMultirange,
66
MultirangeOrRangeMaybeNullable, RangeHelper, RangeOrNullableRange, TextOrNullableText,
77
};
88
use super::date_and_time::{AtTimeZone, DateTimeLike};
@@ -3417,8 +3417,8 @@ where
34173417

34183418
pub(in crate::pg) mod private {
34193419
use crate::sql_types::{
3420-
Array, Binary, Cidr, Inet, Integer, Json, Jsonb, Multirange, Nullable, Range, SingleValue,
3421-
SqlType, Text,
3420+
Array, Binary, Cidr, Inet, Integer, Json, Jsonb, MaybeNullableType, Multirange, Nullable,
3421+
Range, SingleValue, SqlType, Text,
34223422
};
34233423
use crate::{Expression, IntoSql};
34243424

@@ -3699,4 +3699,17 @@ pub(in crate::pg) mod private {
36993699

37003700
impl BinaryOrNullableBinary for Binary {}
37013701
impl BinaryOrNullableBinary for Nullable<Binary> {}
3702+
3703+
pub trait MaybeNullableValue<T>: SingleValue {
3704+
type Out: SingleValue;
3705+
}
3706+
3707+
impl<T, O> MaybeNullableValue<O> for T
3708+
where
3709+
T: SingleValue,
3710+
T::IsNull: MaybeNullableType<O>,
3711+
<T::IsNull as MaybeNullableType<O>>::Out: SingleValue,
3712+
{
3713+
type Out = <T::IsNull as MaybeNullableType<O>>::Out;
3714+
}
37023715
}

diesel/src/pg/expression/functions.rs

+47
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use super::expression_methods::InetOrCidr;
44
use crate::expression::functions::define_sql_function;
55
use crate::pg::expression::expression_methods::ArrayOrNullableArray;
6+
use crate::pg::expression::expression_methods::MaybeNullableValue;
67
use crate::pg::expression::expression_methods::MultirangeOrNullableMultirange;
78
use crate::pg::expression::expression_methods::MultirangeOrRangeMaybeNullable;
89
use crate::pg::expression::expression_methods::RangeOrNullableRange;
@@ -1423,3 +1424,49 @@ define_sql_function! {
14231424
/// ```
14241425
fn array_upper<Arr: ArrayOrNullableArray + SingleValue>(array: Arr, dimension: Integer) -> Nullable<Integer>;
14251426
}
1427+
1428+
#[cfg(feature = "postgres_backend")]
1429+
define_sql_function! {
1430+
/// Converts any SQL value to json
1431+
///
1432+
/// # Example
1433+
///
1434+
/// ```rust
1435+
/// # include!("../../doctest_setup.rs");
1436+
/// #
1437+
/// # fn main() {
1438+
/// # #[cfg(feature = "serde_json")]
1439+
/// # run_test().unwrap();
1440+
/// # }
1441+
/// #
1442+
/// # #[cfg(feature = "serde_json")]
1443+
/// # fn run_test() -> QueryResult<()> {
1444+
/// # use diesel::dsl::to_json;
1445+
/// # use serde_json::{json, Value};
1446+
/// # use diesel::sql_types::{Integer, Array, Json, Text, Nullable};
1447+
/// # let connection = &mut establish_connection();
1448+
/// let result = diesel::select(to_json::<Integer, _>(1))
1449+
/// .get_result::<Value>(connection)?;
1450+
///
1451+
/// assert_eq!(json!(1), result);
1452+
///
1453+
/// let result = diesel::select(to_json::<Array<Text>, _>(vec!["abc", "xyz"]))
1454+
/// .get_result::<Value>(connection)?;
1455+
///
1456+
/// assert_eq!(json!(["abc", "xyz"]), result);
1457+
///
1458+
/// let result = diesel::select(to_json::<Array<Nullable<Text>>, _>(Vec::<String>::new()))
1459+
/// .get_result::<Value>(connection)?;
1460+
///
1461+
/// assert_eq!(json!([]), result);
1462+
///
1463+
/// let result = diesel::select(to_json::<Nullable<Text>, _>(None::<String>))
1464+
/// .get_result::<Option<Value>>(connection)?;
1465+
///
1466+
/// assert!(result.is_none());
1467+
///
1468+
/// # Ok(())
1469+
/// # }
1470+
/// ```
1471+
fn to_json<E: MaybeNullableValue<Json>>(e: E) -> E::Out;
1472+
}

diesel/src/pg/expression/helper_types.rs

+5
Original file line numberDiff line numberDiff line change
@@ -461,3 +461,8 @@ pub type array_positions<A, E> =
461461
#[allow(non_camel_case_types)]
462462
#[cfg(feature = "postgres_backend")]
463463
pub type array_ndims<A> = super::functions::array_ndims<SqlTypeOf<A>, A>;
464+
465+
/// Return type of [`to_json(element)`](super::functions::to_json())
466+
#[allow(non_camel_case_types)]
467+
#[cfg(feature = "postgres_backend")]
468+
pub type to_json<E> = super::functions::to_json<SqlTypeOf<E>, E>;

diesel_derives/tests/auto_type.rs

+1
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ fn postgres_functions() -> _ {
432432
array_position_with_subscript(pg_extras::array, pg_extras::id, pg_extras::id),
433433
array_positions(pg_extras::array, pg_extras::id),
434434
array_ndims(pg_extras::array),
435+
to_json(pg_extras::id),
435436
)
436437
}
437438

0 commit comments

Comments
 (0)