diesel_sqlite_struct_json_text/
lib.rs1use proc_macro::{TokenStream};
2use syn::{parse_macro_input, DeriveInput};
3use quote::quote;
4
5#[proc_macro_attribute]
6pub fn diesel_sqlite_struct_json_text(_args: TokenStream, input: TokenStream) -> TokenStream {
7 let input = parse_macro_input!(input as DeriveInput);
8 let name = &input.ident;
9
10 return quote!{
11 #[derive(Debug, diesel::FromSqlRow, diesel::AsExpression, serde::Serialize, serde::Deserialize)]
12 #[diesel(sql_type = diesel::sql_types::Text)]
13 #input
14
15 impl diesel::serialize::ToSql<diesel::sql_types::Text, diesel::sqlite::Sqlite> for #name {
16 fn to_sql<'b>(&'b self, out: &mut diesel::serialize::Output<'b, '_, diesel::sqlite::Sqlite>) -> diesel::serialize::Result {
17 let json = serde_json::to_string(self).unwrap();
18 out.set_value(json);
19 Ok(diesel::serialize::IsNull::No)
20 }
21 }
22
23 impl diesel::deserialize::FromSql<diesel::sql_types::Text, diesel::sqlite::Sqlite> for #name {
24 fn from_sql(bytes: diesel::sqlite::SqliteValue<'_, '_, '_>) -> diesel::deserialize::Result<Self> {
25 let value = <String as diesel::deserialize::FromSql<diesel::sql_types::Text, diesel::sqlite::Sqlite>>::from_sql(bytes)?;
26 Ok(serde_json::from_str(&value).unwrap())
27 }
28 }
29 }.into();
30}