assemble_build/
plugin_function.rs1use 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}