summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-02-27 20:25:05 +0800
committer魏曹先生 <1992414357@qq.com>2026-02-27 22:31:21 +0800
commit932050d82212ee7db6bd4cb746fb79f40aa7cbf9 (patch)
treec4c868ead7191510d5a23c998658ba319dc3cdb7 /src/lib.rs
Initialize project with Cargo.toml and basic structure
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..2df8e46
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,71 @@
+use std::collections::HashMap;
+
+pub mod expand;
+pub mod test;
+
+#[derive(Default, Clone)]
+pub struct Template {
+ pub(crate) template_str: String,
+ pub(crate) params: HashMap<String, String>,
+ pub(crate) impl_params: HashMap<String, Vec<HashMap<String, String>>>,
+}
+
+impl Template {
+ /// Add a parameter
+ pub fn insert_param(&mut self, name: String, value: String) {
+ self.params.insert(name, value);
+ }
+
+ /// Add an implementation block and return a HashMap to set its parameters
+ pub fn add_impl(&mut self, impl_name: String) -> &mut Vec<HashMap<String, String>> {
+ self.impl_params
+ .entry(impl_name)
+ .or_insert_with(|| Vec::<HashMap<String, String>>::new())
+ }
+}
+
+impl From<String> for Template {
+ fn from(s: String) -> Self {
+ Template {
+ template_str: s,
+ ..Default::default()
+ }
+ }
+}
+
+impl std::fmt::Display for Template {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let cloned = self.clone();
+ write!(f, "{}", cloned.expand().unwrap_or_default())
+ }
+}
+
+#[macro_export]
+macro_rules! tmpl_param {
+ ($template:ident, $($key:ident = $value:expr),* $(,)?) => {{
+ $(
+ $template.insert_param(stringify!($key).to_string(), $value.to_string());
+ )*
+ }};
+}
+
+#[macro_export]
+macro_rules! tmpl {
+ ($template:ident += {
+ $($name:ident {
+ $(($($key:ident = $value:expr),* $(,)?)),*
+ $(,)?
+ }),*
+ }) => {{
+ $(
+ let $name = $template.add_impl(stringify!($name).to_string());
+ $(
+ $name.push({
+ let mut params = std::collections::HashMap::new();
+ $(params.insert(stringify!($key).to_string(), $value.to_string());)*
+ params
+ });
+ )*
+ )*
+ }};
+}