syn_prelude/
fork.rs

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}