MCPcopy Create free account
hub / github.com/aiscriptdev/aiscript / collect_derive

Function collect_derive

aiscript-derived/src/lib.rs:42–231  ·  view source on GitHub ↗
(mut s: synstructure::Structure)

Source from the content-addressed store, hash-verified

40}
41
42fn collect_derive(mut s: synstructure::Structure) -> TokenStream {
43 let mut mode = None;
44 let mut override_bound = None;
45
46 let result = match find_collect_meta(&s.ast().attrs) {
47 Ok(Some(attr)) => attr.parse_nested_meta(|meta| {
48 if meta.path.is_ident("bound") {
49 if override_bound.is_some() {
50 return Err(usage_error(&meta, "multiple bounds specified"));
51 }
52
53 let lit: syn::LitStr = meta.value()?.parse()?;
54 override_bound = Some(lit);
55 return Ok(());
56 }
57
58 meta.input.parse::<syn::parse::Nothing>()?;
59
60 if mode.is_some() {
61 return Err(usage_error(&meta, "multiple modes specified"));
62 } else if meta.path.is_ident("require_static") {
63 mode = Some(Mode::RequireStatic);
64 } else if meta.path.is_ident("no_drop") {
65 mode = Some(Mode::NoDrop);
66 } else if meta.path.is_ident("unsafe_drop") {
67 mode = Some(Mode::UnsafeDrop);
68 } else {
69 return Err(usage_error(&meta, "unknown option"));
70 }
71 Ok(())
72 }),
73 Ok(None) => Ok(()),
74 Err(err) => Err(err),
75 };
76
77 if let Err(err) = result {
78 return err.to_compile_error();
79 }
80
81 let Some(mode) = mode else {
82 panic!(
83 "{}",
84 "deriving `Collect` requires a `#[collect(...)]` attribute"
85 );
86 };
87
88 let where_clause = if mode == Mode::RequireStatic {
89 quote!(where Self: 'static)
90 } else {
91 override_bound
92 .as_ref()
93 .map(|x| {
94 x.parse()
95 .expect("`#[collect]` failed to parse explicit trait bound expression")
96 })
97 .unwrap_or_else(|| quote!())
98 };
99

Callers

nothing calls this directly

Calls 7

find_collect_metaFunction · 0.85
usage_errorFunction · 0.85
pushMethod · 0.80
parseMethod · 0.45
as_refMethod · 0.45
cloneMethod · 0.45
errorMethod · 0.45

Tested by

no test coverage detected