From fea4411aa60a2a22fbd527b63c598abef30eb3e0 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Wed, 5 Nov 2025 16:28:56 -0700 Subject: [PATCH] feat: Added built-in macros --- assets/macros/generate-commit-message.yaml | 2 ++ src/config/macros.rs | 39 +++++++++++++++++++++- src/config/mod.rs | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 assets/macros/generate-commit-message.yaml diff --git a/assets/macros/generate-commit-message.yaml b/assets/macros/generate-commit-message.yaml new file mode 100644 index 0000000..364cc26 --- /dev/null +++ b/assets/macros/generate-commit-message.yaml @@ -0,0 +1,2 @@ +steps: + - .file `git diff` -- generate a git commit message \ No newline at end of file diff --git a/src/config/macros.rs b/src/config/macros.rs index d6c021f..ca7d8ed 100644 --- a/src/config/macros.rs +++ b/src/config/macros.rs @@ -1,12 +1,19 @@ -use crate::config::{Config, GlobalConfig, RoleLike}; +use crate::config::{ensure_parent_exists, Config, GlobalConfig, RoleLike}; use crate::repl::{run_repl_command, split_args_text}; use crate::utils::{multiline_text, AbortSignal}; use anyhow::{anyhow, Result}; use indexmap::IndexMap; use parking_lot::RwLock; +use rust_embed::Embed; use serde::Deserialize; +use std::fs::File; +use std::io::Write; use std::sync::Arc; +#[derive(Embed)] +#[folder = "assets/macros"] +struct MacroAssets; + #[async_recursion::async_recursion] pub async fn macro_execute( config: &GlobalConfig, @@ -53,6 +60,36 @@ pub struct Macro { } impl Macro { + pub fn install_macros() -> Result<()> { + info!( + "Installing built-in macros in {}", + Config::macros_dir().display() + ); + + for file in MacroAssets::iter() { + debug!("Processing macro file: {}", file.as_ref()); + let embedded_file = MacroAssets::get(&file) + .ok_or_else(|| anyhow!("Failed to load embedded macro file: {}", file.as_ref()))?; + let content = unsafe { std::str::from_utf8_unchecked(&embedded_file.data) }; + let file_path = Config::macros_dir().join(file.as_ref()); + + if file_path.exists() { + debug!( + "Macro file already exists, skipping: {}", + file_path.display() + ); + continue; + } + + ensure_parent_exists(&file_path)?; + info!("Creating macro file: {}", file_path.display()); + let mut macro_file = File::create(&file_path)?; + macro_file.write_all(content.as_bytes())?; + } + + Ok(()) + } + pub fn resolve_variables(&self, args: &[String]) -> Result> { let mut output = IndexMap::new(); for (i, variable) in self.variables.iter().enumerate() { diff --git a/src/config/mod.rs b/src/config/mod.rs index 5f19664..857e06c 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -364,6 +364,7 @@ impl Config { config.setup_model()?; config.setup_document_loaders(); config.setup_user_agent(); + Macro::install_macros()?; Ok(()) }; let ret = setup(&mut config).await;