darling_core/util/
with_original.rs1use crate::{
2 usage::{UsesLifetimes, UsesTypeParams},
3 FromDeriveInput, FromField, FromGenericParam, FromGenerics, FromMeta, FromTypeParam,
4 FromVariant, Result,
5};
6
7#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct WithOriginal<T, O> {
10 pub parsed: T,
11 pub original: O,
12}
13
14impl<T, O> WithOriginal<T, O> {
15 pub fn new(parsed: T, original: O) -> Self {
16 WithOriginal { parsed, original }
17 }
18}
19
20macro_rules! with_original {
21 ($trayt:ident, $func:ident, $syn:path) => {
22 impl<T: $trayt> $trayt for WithOriginal<T, $syn> {
23 fn $func(value: &$syn) -> Result<Self> {
24 Ok(WithOriginal::new($trayt::$func(value)?, value.clone()))
25 }
26 }
27 };
28}
29
30with_original!(FromDeriveInput, from_derive_input, syn::DeriveInput);
31with_original!(FromField, from_field, syn::Field);
32with_original!(FromGenerics, from_generics, syn::Generics);
33with_original!(FromGenericParam, from_generic_param, syn::GenericParam);
34with_original!(FromMeta, from_meta, syn::Meta);
35with_original!(FromTypeParam, from_type_param, syn::TypeParam);
36with_original!(FromVariant, from_variant, syn::Variant);
37
38impl<P: UsesLifetimes, O> UsesLifetimes for WithOriginal<P, O> {
40 fn uses_lifetimes<'a>(
41 &self,
42 options: &crate::usage::Options,
43 lifetimes: &'a crate::usage::LifetimeSet,
44 ) -> crate::usage::LifetimeRefSet<'a> {
45 self.parsed.uses_lifetimes(options, lifetimes)
46 }
47}
48
49impl<P: UsesTypeParams, O> UsesTypeParams for WithOriginal<P, O> {
51 fn uses_type_params<'a>(
52 &self,
53 options: &crate::usage::Options,
54 type_set: &'a crate::usage::IdentSet,
55 ) -> crate::usage::IdentRefSet<'a> {
56 self.parsed.uses_type_params(options, type_set)
57 }
58}