assemble_build/
plugin_function.rs

1//! Create plugin functions
2
3use syn::parse::{Parse, ParseStream};
4use syn::punctuated::Punctuated;
5use syn::{Ident, ItemFn, Lit, Signature, Token};
6
7#[derive(Debug)]
8pub struct PluginFunction {
9    module: String,
10    identifier: String,
11    sig: Signature,
12    meta: PluginFunctionMetadata,
13}
14
15#[derive(Debug)]
16pub struct PluginFunctionMetadata {
17    plugin_id: String,
18}
19
20impl PluginFunction {
21    pub fn try_create(_module: String, _item: ItemFn) -> Option<Self> {
22        None
23    }
24}
25
26struct Assignment {
27    id: Ident,
28    eq: Token![=],
29    value: Lit,
30}
31
32impl Parse for Assignment {
33    fn parse(input: ParseStream) -> syn::Result<Self> {
34        Ok(Self {
35            id: input.parse()?,
36            eq: input.parse()?,
37            value: input.parse()?,
38        })
39    }
40}
41
42impl Parse for PluginFunctionMetadata {
43    fn parse(input: ParseStream) -> syn::Result<Self> {
44        let split: Punctuated<Assignment, Token![,]> = input.parse_terminated(Assignment::parse)?;
45
46        let mut output = Self {
47            plugin_id: "".to_string(),
48        };
49        for assignment in split {
50            let id = assignment.id.to_string();
51            let value = assignment.value;
52
53            match &*id {
54                "plugin_id" => {
55                    match &value {
56                        Lit::Str(s) => {
57                            output.plugin_id = s.value();
58                        }
59                        _ => {
60                            return Err(syn::Error::new(
61                                value.span(),
62                                "plugin_id must be a string",
63                            ));
64                        }
65                    };
66                }
67                _ => {
68                    return Err(syn::Error::new(
69                        assignment.id.span(),
70                        "not a valid setting for Plugins",
71                    ))
72                }
73            };
74        }
75
76        Ok(output)
77    }
78}