From c8fcdca4eb09709966ea25883cbe91f34c038236 Mon Sep 17 00:00:00 2001 From: Evgeny Zemtsov Date: Thu, 22 Jun 2023 17:57:50 +0200 Subject: feat(tvix/eval): allow extending builtins outside of tvix_eval The change allows applications that use tvix_serde for parsing nix-based configuration to extend the language with domain-specific set of features. Change-Id: Ia86612308a167c456ecf03e93fe0fbae55b876a6 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8848 Reviewed-by: tazjin Tested-by: BuildkiteCI --- tvix/serde/src/de_tests.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'tvix/serde/src/de_tests.rs') diff --git a/tvix/serde/src/de_tests.rs b/tvix/serde/src/de_tests.rs index 50a078cc0998..a77a59f2b5cd 100644 --- a/tvix/serde/src/de_tests.rs +++ b/tvix/serde/src/de_tests.rs @@ -1,5 +1,6 @@ use serde::Deserialize; use std::collections::HashMap; +use tvix_eval::builtin_macros::builtins; use crate::de::{from_str, from_str_with_config}; @@ -209,3 +210,36 @@ fn deserialize_with_config() { assert_eq!(result, "ok"); } + +#[builtins] +mod test_builtins { + use genawaiter::rc::Gen; + use tvix_eval::generators::GenCo; + use tvix_eval::{ErrorKind, NixString, Value}; + + #[builtin("prependHello")] + pub async fn builtin_prepend_hello(co: GenCo, x: Value) -> Result { + match x { + Value::String(s) => { + let new_string = NixString::from(format!("hello {}", s.as_str())); + Ok(Value::String(new_string)) + } + _ => Err(ErrorKind::TypeError { + expected: "string", + actual: "not string", + }), + } + } +} + +#[test] +fn deserialize_with_extra_builtin() { + let code = "builtins.prependHello \"world\""; + + let result: String = from_str_with_config(code, |eval| { + eval.builtins.append(&mut test_builtins::builtins()); + }) + .expect("should deserialize"); + + assert_eq!(result, "hello world"); +} -- cgit 1.4.1