1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use crate::{types::PackageCallback, Package};

#[derive(Default)]
pub struct ImplPackage {
  name: &'static str,
  method: Vec<(&'static str, PackageCallback)>,
}

impl ImplPackage {
  pub fn new() -> Self {
    Self {
      name: "💻 ImplPackage [struct]",
      ..Self::default()
    }
  }

  pub fn set_name(mut self, name: &'static str) -> Self {
    self.name = name;
    self
  }

  pub fn add_method(mut self, name: &'static str, callback: PackageCallback) -> Self {
    self.method.push((name, callback));
    self
  }
}

impl Package for ImplPackage {
  fn name(&self) -> &'static str {
    self.name
  }

  fn dyn_methods(&self) -> crate::types::DynMethodRes {
    self.method.clone()
  }
}

#[macro_export]
macro_rules! package {
  ($name:expr, $call:expr) => {
    ImplPackage::new()
      .set_name("💻 ImplPackage [macro]")
      .add_method($name, $call)
  };
}