fire_stream_api_codegen/
util.rs1use proc_macro2::{Span, TokenStream, Ident};
2use syn::{Result, Signature, FnArg, Type, punctuated, Error, TypeReference};
3use quote::quote;
4
5use proc_macro_crate::{crate_name, FoundCrate};
6
7
8pub(crate) fn validate_signature(sig: &Signature) -> Result<()> {
9 if let Some(con) = &sig.constness {
10 return Err(Error::new(con.span, "const not allowed"))
11 }
12
13 if let Some(unsf) = &sig.unsafety {
14 return Err(Error::new(unsf.span, "unsafe not allowed"))
15 }
16
17 if let Some(abi) = &sig.abi {
18 return Err(Error::new_spanned(abi, "abi not allowed"))
19 }
20
21 if !sig.generics.params.is_empty() {
22 return Err(Error::new_spanned(&sig.generics, "generics not allowed"))
23 }
24
25 if let Some(variadic) = &sig.variadic {
26 return Err(Error::new_spanned(&variadic, "variadic not allowed"))
27 }
28
29 Ok(())
30}
31
32#[allow(dead_code)]
33pub(crate) fn ref_type(ty: &Type) -> Option<&TypeReference> {
34 match ty {
35 Type::Reference(r) => Some(r),
36 _ => None
37 }
38}
39
40#[allow(dead_code)]
41pub(crate) fn validate_inputs(
42 inputs: punctuated::Iter<'_, FnArg>
43) -> Result<Vec<Box<Type>>> {
44 let mut v = vec![];
45
46 for fn_arg in inputs {
47 let ty = match fn_arg {
48 FnArg::Receiver(r) => {
49 return Err(Error::new_spanned(r, "self not allowed"))
50 },
51 FnArg::Typed(t) => t.ty.clone()
52 };
53
54 if let Some(reff) = ref_type(&ty) {
55 if let Some(mu) = reff.mutability {
56 return Err(Error::new_spanned(mu, "&mut not supported"))
57 }
58
59 if let Some(lifetime) = &reff.lifetime {
60 return Err(Error::new_spanned(lifetime, "lifetimes not \
61 supported"))
62 }
63 }
64
65 v.push(ty);
66 }
67
68 Ok(v)
69}
70
71pub(crate) fn fire_api_crate() -> Result<TokenStream> {
72 let name = crate_name("fire-stream-api")
73 .map_err(|e| Error::new(Span::call_site(), e))?;
74
75 Ok(match name {
76 FoundCrate::Itself => quote!(crate),
78 FoundCrate::Name(n) => {
79 let ident = Ident::new(&n, Span::call_site());
80 quote!(#ident)
81 }
82 })
83}