accessory/derive_accessors/
final_options.rs

1use macroific::prelude::*;
2use proc_macro2::Ident;
3use syn::punctuated::Punctuated;
4use syn::{Token, Visibility, WherePredicate};
5
6use super::options::{DerefKind, SkippableIdent};
7use super::{VariationDefaults, VariationOptions};
8
9#[cfg_attr(feature = "_debug", derive(Debug))]
10pub struct FinalOptions {
11    pub owned: bool,
12    pub const_fn: bool,
13    pub skip: bool,
14    pub cp: bool,
15    pub as_ref: bool,
16    pub ptr_deref: Option<DerefKind>,
17    pub vis: Visibility,
18    pub prefix: Option<SkippableIdent>,
19    pub suffix: Option<SkippableIdent>,
20    pub ty: Option<syn::Type>,
21    pub bounds: Punctuated<WherePredicate, Token![,]>,
22}
23
24#[cfg_attr(feature = "_debug", derive(Debug))]
25pub struct Naming {
26    pub prefix: Option<&'static str>,
27    pub suffix: Option<&'static str>,
28}
29
30impl Naming {
31    pub const GET: Self = Self {
32        prefix: None,
33        suffix: None,
34    };
35    pub const GET_MUT: Self = Self {
36        prefix: None,
37        suffix: Some("mut"),
38    };
39    pub const SET: Self = Self {
40        prefix: Some("set"),
41        suffix: None,
42    };
43}
44
45impl FinalOptions {
46    pub fn new(
47        enable_by_default: bool,
48        defaults_from_struct: &VariationDefaults,
49        defaults_for_variation: &'static Naming,
50        opts: Option<VariationOptions>,
51        opts_all_field: Option<&VariationOptions>,
52        opts_all_container: &VariationDefaults,
53    ) -> Option<Self> {
54        let mut opts = match (enable_by_default, opts) {
55            (
56                _,
57                Some(VariationOptions {
58                    skip: Some(skip), ..
59                }),
60            ) if skip => return None,
61            (_, Some(mut opts)) => {
62                opts.assign_defaults_from_prop_all(opts_all_field);
63                opts.assign_defaults_from_struct(defaults_from_struct);
64                opts
65            }
66            (true, None) => {
67                if let Some(opts_all_field) = opts_all_field {
68                    let mut opts_all_field = opts_all_field.clone();
69                    opts_all_field.assign_defaults_from_struct(defaults_from_struct);
70                    opts_all_field
71                } else {
72                    defaults_from_struct.into()
73                }
74            }
75            _ => return None,
76        };
77        opts.assign_defaults_from_struct(opts_all_container);
78
79        let mut out = Self {
80            owned: opts.owned.unwrap_or_default(),
81            const_fn: opts.const_fn.unwrap_or_default(),
82            skip: opts.skip.unwrap_or_default(),
83            cp: opts.cp.unwrap_or_default(),
84            as_ref: opts.as_ref.unwrap_or_default(),
85            ptr_deref: opts.ptr_deref,
86            vis: opts
87                .vis
88                .unwrap_or_else(move || Visibility::Public(Default::default())),
89            prefix: opts.prefix,
90            suffix: opts.suffix,
91            ty: opts.ty,
92            bounds: opts.bounds,
93        };
94        out.apply_naming_defaults(defaults_for_variation);
95
96        Some(out)
97    }
98
99    pub fn apply_naming_defaults(&mut self, defaults: &'static Naming) {
100        if self.prefix.is_none() {
101            if let Some(v) = defaults.prefix {
102                self.prefix = Some(SkippableIdent::Ident(Ident::create(v)));
103            }
104        }
105        if self.suffix.is_none() {
106            if let Some(v) = defaults.suffix {
107                self.suffix = Some(SkippableIdent::Ident(Ident::create(v)));
108            }
109        }
110    }
111}