fire_stream_api_codegen/
util.rs

1use 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		// if it get's used inside itself it is a test or an example
77		FoundCrate::Itself => quote!(crate),
78		FoundCrate::Name(n) => {
79			let ident = Ident::new(&n, Span::call_site());
80			quote!(#ident)
81		}
82	})
83}