1 use crate::utils
::{add_extra_where_clauses, SingleFieldData, State}
;
2 use proc_macro2
::TokenStream
;
4 use syn
::{parse::Result, DeriveInput}
;
6 /// Provides the hook to expand `#[derive(Deref)]` into an implementation of `Deref`
7 pub fn expand(input
: &DeriveInput
, trait_name
: &'
static str) -> Result
<TokenStream
> {
8 let state
= State
::with_field_ignore_and_forward(
12 trait_name
.to_lowercase(),
23 } = state
.assert_single_enabled_field();
25 let (target
, body
, generics
) = if info
.forward
{
27 quote
!(#casted_trait::Target),
28 quote
!(#casted_trait::deref(&#member)),
29 add_extra_where_clauses(
32 where #field_type: #trait_path
40 input
.generics
.clone(),
43 let (impl_generics
, _
, where_clause
) = generics
.split_for_impl();
46 impl#impl_generics #trait_path for #input_type#ty_generics #where_clause
48 type Target
= #target;
50 fn deref(&self) -> &Self::Target
{