accessory/derive_accessors/
final_options.rs1use 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}