1use syn::parse::{discouraged::Speculative, Parse, ParseBuffer, ParseStream};
2
3pub trait ForkWithParseFn {
4 fn fork_with_parse_fn<T, F: Fn(ParseStream) -> syn::Result<T>>(
5 &self,
6 parse: F,
7 ) -> syn::Result<T>;
8}
9
10impl ForkWithParseFn for ParseStream<'_> {
11 fn fork_with_parse_fn<T, F: Fn(ParseStream) -> syn::Result<T>>(
12 &self,
13 parse: F,
14 ) -> syn::Result<T> {
15 let fork = self.fork();
16 let res = parse(&fork);
17 if res.is_ok() {
18 self.advance_to(&fork);
19 }
20 res
21 }
22}
23
24impl ForkWithParseFn for ParseBuffer<'_> {
25 fn fork_with_parse_fn<T, F: Fn(ParseStream) -> syn::Result<T>>(
26 &self,
27 parse: F,
28 ) -> syn::Result<T> {
29 let fork = self.fork();
30 let res = parse(&fork);
31 if res.is_ok() {
32 self.advance_to(&fork);
33 }
34 res
35 }
36}
37
38pub trait ForkWithParsible {
39 fn fork_with_parsible<T: Parse>(&self) -> syn::Result<T>;
40}
41
42impl ForkWithParsible for ParseStream<'_> {
43 fn fork_with_parsible<T: Parse>(&self) -> syn::Result<T> {
44 let fork = self.fork();
45 let res = T::parse(&fork);
46 if res.is_ok() {
47 self.advance_to(&fork);
48 }
49 res
50 }
51}
52
53impl ForkWithParsible for ParseBuffer<'_> {
54 fn fork_with_parsible<T: Parse>(&self) -> syn::Result<T> {
55 let fork = self.fork();
56 let res = T::parse(&fork);
57 if res.is_ok() {
58 self.advance_to(&fork);
59 }
60 res
61 }
62}