shed/sql/derive/lib.rs (38 lines of code) (raw):

/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under both the MIT license found in the * LICENSE-MIT file in the root directory of this source tree and the Apache * License, Version 2.0 found in the LICENSE-APACHE file in the root directory * of this source tree. */ //! Module introduces a proc macro for sql_common::mysql. extern crate proc_macro; use proc_macro::TokenStream; use quote::quote; use syn::{parse_macro_input, DeriveInput}; /// The proc macro allows to derive an implementation of mysql_client::OptionalTryFromRowField /// trait for the type if that type implements mysql_async::FromValueOpt. /// This is the one to use if NULL maps to None #[proc_macro_derive(OptTryFromRowField)] pub fn derive_opttryfrom_rowfield(input: TokenStream) -> TokenStream { let parsed_input = parse_macro_input!(input as DeriveInput); let name = parsed_input.ident; let expanded = quote! { impl mysql::OptionalTryFromRowField for #name { fn try_from_opt(field: mysql::RowField) -> Result<Option<Self>, mysql::ValueError> { mysql::opt_try_from_rowfield(field) } } }; expanded.into() } /// The proc macro allows to derive an implementation of mysql_client::TryFromRowField /// trait for the type if that type implements mysql_async::FromValueOpt. /// This is the one to use if NULL does not map to None #[proc_macro_derive(TryFromRowField)] pub fn derive_tryfrom_rowfield(input: TokenStream) -> TokenStream { let parsed_input = parse_macro_input!(input as DeriveInput); let name = parsed_input.ident; let expanded = quote! { impl mysql::TryFromRowField for #name { fn try_from(field: mysql::RowField) -> Result<Self, mysql::ValueError> { mysql::opt_try_from_rowfield(field) } } }; expanded.into() }