diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d8eb132..673f4fbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to MiniJinja are documented here. +# Unreleased + +- Added `Value::from_function`. + # 0.22.1 - Fixed an incorrect manifest for `minijinja-autoreload`. diff --git a/minijinja/src/environment.rs b/minijinja/src/environment.rs index cbe8f5ed..c702d8a6 100644 --- a/minijinja/src/environment.rs +++ b/minijinja/src/environment.rs @@ -413,7 +413,7 @@ impl<'source> Environment<'source> { Rv: FunctionResult, Args: for<'a> FunctionArgs<'a>, { - self.add_global(name, functions::BoxedFunction::new(f).to_value()); + self.add_global(name, Value::from_function(f)) } /// Adds a global variable. diff --git a/minijinja/src/value/mod.rs b/minijinja/src/value/mod.rs index 7d3d3991..7cc7493b 100644 --- a/minijinja/src/value/mod.rs +++ b/minijinja/src/value/mod.rs @@ -78,6 +78,7 @@ use std::sync::Arc; use serde::ser::{Serialize, Serializer}; use crate::error::{Error, ErrorKind}; +use crate::functions; use crate::key::{Key, StaticKey}; use crate::utils::OnDrop; use crate::value::serialize::ValueSerializer; @@ -370,6 +371,18 @@ impl Value { Value::from_rc_object(Arc::new(value)) } + /// Creates a callable value from a function. + pub fn from_function(f: F) -> Value + where + // the crazy bounds here exist to enable borrowing in closures + F: functions::Function + + for<'a> functions::Function>::Output>, + Rv: FunctionResult, + Args: for<'a> FunctionArgs<'a>, + { + functions::BoxedFunction::new(f).to_value() + } + /// Returns some reference to the boxed object if it is of type `T`, or None if it isn’t. /// /// This is basically the "reverse" of [`from_object`](Self::from_object).