about summary refs log tree commit diff
path: root/tvix/eval
diff options
context:
space:
mode:
authorFlorian Klink <flokli@flokli.de>2023-01-24T14·54+0100
committerclbot <clbot@tvl.fyi>2023-01-25T07·49+0000
commite0b05c0fa6562bc7d3c87a66c6557ad74fdbbd8f (patch)
tree9777bf85c45f0527428c38974b102a0acf0455f2 /tvix/eval
parent1facd889bba724cf20ea14422ee1e57440b3e761 (diff)
feat(tvix/eval): implement builtins.fromTOML r/5754
This allows parsing TOML from Tvix. We can enable the eval-okay-fromTOML
testcase from nix_tests. It uses the `toml` crate, and the serde
integration it brings with it.

Change-Id: Ic6f95aacf2aeb890116629b409752deac49dd655
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7920
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/eval')
-rw-r--r--tvix/eval/Cargo.toml7
-rw-r--r--tvix/eval/src/builtins/mod.rs7
-rw-r--r--tvix/eval/src/errors.rs15
-rw-r--r--tvix/eval/src/tests/nix_tests/eval-okay-fromTOML.exp (renamed from tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-fromTOML.exp)0
-rw-r--r--tvix/eval/src/tests/nix_tests/eval-okay-fromTOML.nix (renamed from tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-fromTOML.nix)0
5 files changed, 26 insertions, 3 deletions
diff --git a/tvix/eval/Cargo.toml b/tvix/eval/Cargo.toml
index d47ad8c397..cf46d4bbd4 100644
--- a/tvix/eval/Cargo.toml
+++ b/tvix/eval/Cargo.toml
@@ -27,6 +27,7 @@ serde_json = "1.0"
 smol_str = "0.1"
 tabwriter = "1.2"
 test-strategy = { version = "0.2.1", optional = true }
+toml = "0.6.0"
 xml-rs = "0.8.4"
 
 [dev-dependencies]
@@ -42,7 +43,7 @@ git = "https://github.com/JamesGuthrie/test-generator.git"
 rev = "82e799979980962aec1aa324ec6e0e4cad781f41"
 
 [features]
-default = [ "impure", "arbitrary", "nix_tests", "backtrace_overflow" ]
+default = ["impure", "arbitrary", "nix_tests", "backtrace_overflow"]
 
 # Enables running the Nix language test suite from the original C++
 # Nix implementation (at version 2.3) against Tvix.
@@ -52,10 +53,10 @@ nix_tests = []
 impure = []
 
 # Enables Arbitrary impls for internal types (required to run tests)
-arbitrary = [ "proptest", "test-strategy", "imbl/proptest" ]
+arbitrary = ["proptest", "test-strategy", "imbl/proptest"]
 
 # For debugging use only; not appropriate for production use.
-backtrace_overflow = [ "backtrace-on-stack-overflow" ]
+backtrace_overflow = ["backtrace-on-stack-overflow"]
 
 [[bench]]
 name = "eval"
diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs
index b1ea408a8c..4f3c93ec14 100644
--- a/tvix/eval/src/builtins/mod.rs
+++ b/tvix/eval/src/builtins/mod.rs
@@ -355,6 +355,13 @@ mod pure_builtins {
         Ok(json_str.into())
     }
 
+    #[builtin("fromTOML")]
+    fn builtin_from_toml(_: &mut VM, toml: Value) -> Result<Value, ErrorKind> {
+        let toml_str = toml.to_str()?;
+
+        toml::from_str(&toml_str).map_err(|err| err.into())
+    }
+
     #[builtin("genericClosure")]
     fn builtin_generic_closure(vm: &mut VM, input: Value) -> Result<Value, ErrorKind> {
         let attrs = input.to_attrs()?;
diff --git a/tvix/eval/src/errors.rs b/tvix/eval/src/errors.rs
index ccc2d89764..8c0d612420 100644
--- a/tvix/eval/src/errors.rs
+++ b/tvix/eval/src/errors.rs
@@ -134,6 +134,9 @@ pub enum ErrorKind {
     /// Errors converting JSON to a value
     FromJsonError(String),
 
+    /// Errors converting TOML to a value
+    FromTomlError(String),
+
     /// An unexpected argument was supplied to a function that takes formal parameters
     UnexpectedArgument {
         arg: NixString,
@@ -246,6 +249,12 @@ impl From<serde_json::Error> for ErrorKind {
     }
 }
 
+impl From<toml::de::Error> for ErrorKind {
+    fn from(err: toml::de::Error) -> Self {
+        Self::FromTomlError(format!("error in TOML serialization: {err}"))
+    }
+}
+
 #[derive(Clone, Debug)]
 pub struct Error {
     kind: ErrorKind,
@@ -434,6 +443,10 @@ to a missing value in the attribute set(s) included via `with`."#,
                 write!(f, "Error converting JSON to a Nix value: {msg}")
             }
 
+            ErrorKind::FromTomlError(msg) => {
+                write!(f, "Error converting TOML to a Nix value: {msg}")
+            }
+
             ErrorKind::UnexpectedArgument { arg, .. } => {
                 write!(
                     f,
@@ -749,6 +762,7 @@ impl Error {
             | ErrorKind::ImportCompilerError { .. }
             | ErrorKind::IO { .. }
             | ErrorKind::FromJsonError(_)
+            | ErrorKind::FromTomlError(_)
             | ErrorKind::Xml(_)
             | ErrorKind::TvixError(_)
             | ErrorKind::TvixBug { .. }
@@ -795,6 +809,7 @@ impl Error {
             ErrorKind::RelativePathResolution(_) => "E032",
             ErrorKind::DivisionByZero => "E033",
             ErrorKind::Xml(_) => "E034",
+            ErrorKind::FromTomlError(_) => "E035",
 
             // Special error code for errors from other Tvix
             // components. We may want to introduce a code namespacing
diff --git a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-fromTOML.exp b/tvix/eval/src/tests/nix_tests/eval-okay-fromTOML.exp
index d0dd3af2c8..d0dd3af2c8 100644
--- a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-fromTOML.exp
+++ b/tvix/eval/src/tests/nix_tests/eval-okay-fromTOML.exp
diff --git a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-fromTOML.nix b/tvix/eval/src/tests/nix_tests/eval-okay-fromTOML.nix
index 9639326899..9639326899 100644
--- a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-fromTOML.nix
+++ b/tvix/eval/src/tests/nix_tests/eval-okay-fromTOML.nix