satisfy
change soykumryknkrmoqznuxssyzykpyzyooz
commit e947f666b20f8c5a9fd007cd3df1daea3fbc6a00
author Alpha Chen <alpha@kejadlen.dev>
date
parent pmnwxwqq
diff --git a/src/main.rs b/src/main.rs
index 2a02bb3..dc21a94 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -285,7 +285,10 @@ impl Default for Frork {
 }
 
 impl Frork {
-    fn lua_table(lua: &Lua) -> Result<LuaTable> {
+    fn lua_table<F>(lua: &Lua, handle_status: F) -> Result<LuaTable>
+    where
+        F: Fn(&Status, &dyn AssertionType) -> Result<()> + Clone + 'static,
+    {
         let frork_table = lua.create_table().map_err(FrorkError::from)?;
         let frork = Rc::new(Self::default());
 
@@ -301,10 +304,12 @@ impl Frork {
             .map_err(FrorkError::from)?;
 
         let frork_clone = frork.clone();
-        let status_fn = lua
-            .create_function(move |_lua, args: LuaMultiValue| frork_clone.status(args))
+        let ok_fn = lua
+            .create_function(move |_lua, args: LuaMultiValue| {
+                frork_clone.ok(args, handle_status.clone())
+            })
             .map_err(FrorkError::from)?;
-        frork_table.set("ok", status_fn).map_err(FrorkError::from)?;
+        frork_table.set("ok", ok_fn).map_err(FrorkError::from)?;
 
         Ok(frork_table)
     }
@@ -328,7 +333,10 @@ impl Frork {
         Ok(())
     }
 
-    fn status(&self, args: LuaMultiValue) -> LuaResult<()> {
+    fn ok<F>(&self, args: LuaMultiValue, handle_status: F) -> LuaResult<()>
+    where
+        F: Fn(&Status, &dyn AssertionType) -> Result<()>,
+    {
         if args.is_empty() {
             return Err(LuaError::external(FrorkError::NoOperation));
         }
@@ -347,15 +355,16 @@ impl Frork {
             .create(&assertion_type, assertion_args)
             .map_err(LuaError::external)?;
         let status = assertion.status().map_err(LuaError::external)?;
-        match status {
-            Status::Ok => println!("ok: {}", assertion.display()),
-            Status::Missing => println!("missing: {}", assertion.display()),
-        }
+
+        handle_status(&status, assertion.as_ref()).map_err(LuaError::external)?;
         Ok(())
     }
 }
 
-fn run_script(script: &str) -> Result<()> {
+fn run_script(
+    script: &str,
+    handle_status: impl Fn(&Status, &dyn AssertionType) -> Result<()> + Clone + 'static,
+) -> Result<()> {
     let lua = Lua::new();
 
     let fennel_code = include_str!("../fennel-1.6.0.lua");
@@ -366,7 +375,8 @@ fn run_script(script: &str) -> Result<()> {
     lua.register_module("fennel", fennel_module)
         .map_err(|e| eyre!("Failed to register Fennel module: {}", e))?;
 
-    let frork_module = Frork::lua_table(&lua).wrap_err("Failed to create Frork module")?;
+    let frork_module =
+        Frork::lua_table(&lua, handle_status).wrap_err("Failed to create Frork module")?;
     lua.register_module("frork", frork_module)
         .map_err(|e| eyre!("Failed to register Frork module: {}", e))?;
 
@@ -382,8 +392,24 @@ fn run_script(script: &str) -> Result<()> {
 
 fn run(command: &Commands) -> Result<()> {
     match command {
-        Commands::Status { script } => run_script(script),
-        Commands::Satisfy { script } => run_script(script),
+        Commands::Status { script } => run_script(script, |status, assertion| {
+            match status {
+                Status::Ok => println!("ok: {}", assertion.display()),
+                Status::Missing => println!("missing: {}", assertion.display()),
+            }
+            Ok(())
+        }),
+        Commands::Satisfy { script } => run_script(script, |status, assertion| {
+            match status {
+                Status::Ok => println!("ok: {}", assertion.display()),
+                Status::Missing => {
+                    println!("missing: {}", assertion.display());
+                    assertion.install()?;
+                    println!("ok: {}", assertion.display());
+                }
+            }
+            Ok(())
+        }),
     }
 }