From faebc14d1796dcb5e97bec97ea704624f1201485 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Mon, 19 Sep 2022 18:50:29 +0200 Subject: [PATCH 1/2] Added the ability to create a value from a function --- CHANGELOG.md | 4 ++++ minijinja/src/environment.rs | 2 +- minijinja/src/value/mod.rs | 13 +++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) 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..0512b07f 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::{self, BoxedFunction}; 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). From 822994f2590c57f017e8713de1c65957df59d231 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Mon, 19 Sep 2022 20:48:14 +0200 Subject: [PATCH 2/2] Make clippy happy --- minijinja/src/value/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/minijinja/src/value/mod.rs b/minijinja/src/value/mod.rs index 0512b07f..7cc7493b 100644 --- a/minijinja/src/value/mod.rs +++ b/minijinja/src/value/mod.rs @@ -78,7 +78,7 @@ use std::sync::Arc; use serde::ser::{Serialize, Serializer}; use crate::error::{Error, ErrorKind}; -use crate::functions::{self, BoxedFunction}; +use crate::functions; use crate::key::{Key, StaticKey}; use crate::utils::OnDrop; use crate::value::serialize::ValueSerializer;