xref: /wasmtime-44.0.1/examples/fuel.rs (revision 46098121)
1 //! Example of limiting a WebAssembly function's runtime using "fuel consumption".
2 
3 // You can execute this example with `cargo run --example fuel`
4 
5 use wasmtime::*;
6 
main() -> Result<()>7 fn main() -> Result<()> {
8     let mut config = Config::new();
9     config.consume_fuel(true);
10     let engine = Engine::new(&config)?;
11     let mut store = Store::new(&engine, ());
12     store.set_fuel(10_000)?;
13     let module = Module::from_file(store.engine(), "examples/fuel.wat")?;
14     let instance = Instance::new(&mut store, &module, &[])?;
15 
16     // Invoke `fibonacci` export with higher and higher numbers until we exhaust our fuel.
17     let fibonacci = instance.get_typed_func::<i32, i32>(&mut store, "fibonacci")?;
18     for n in 1.. {
19         let fuel_before = store.get_fuel().unwrap();
20         let output = match fibonacci.call(&mut store, n) {
21             Ok(v) => v,
22             Err(e) => {
23                 assert_eq!(e.downcast::<Trap>()?, Trap::OutOfFuel);
24                 println!("Exhausted fuel computing fib({n})");
25                 break;
26             }
27         };
28         let fuel_consumed = fuel_before - store.get_fuel().unwrap();
29         println!("fib({n}) = {output} [consumed {fuel_consumed} fuel]");
30         store.set_fuel(10_000)?;
31     }
32     Ok(())
33 }
34