darling_core/util/
with_original.rs

1use crate::{
2    usage::{UsesLifetimes, UsesTypeParams},
3    FromDeriveInput, FromField, FromGenericParam, FromGenerics, FromMeta, FromTypeParam,
4    FromVariant, Result,
5};
6
7/// A container to parse some syntax and retain access to the original.
8#[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
38/// Get the lifetime usage of `parsed`.
39impl<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
49/// Get the type param usage of `parsed`.
50impl<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}