From 8135a8d38cefdc4632b3c85fdbb663d067f91248 Mon Sep 17 00:00:00 2001 From: Aspen Smith Date: Tue, 5 Dec 2023 17:11:45 -0500 Subject: fix(tvix/eval): Return error rather than panicking on bad substring If builtins.substring is invoked with (byte!!) offsets that aren't at codepoint boundaries, return an error rather than panicking. This is still incorrect (see b/337) but pushes the incorrectness forward a step. Change-Id: I5a4261f2ff250874cd36489ef598dcf886669d04 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10199 Tested-by: BuildkiteCI Autosubmit: grfn Reviewed-by: sterni --- tvix/eval/src/value/string.rs | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'tvix/eval/src/value/string.rs') diff --git a/tvix/eval/src/value/string.rs b/tvix/eval/src/value/string.rs index 8a69e060c6..314b21d668 100644 --- a/tvix/eval/src/value/string.rs +++ b/tvix/eval/src/value/string.rs @@ -8,6 +8,7 @@ use std::ffi::OsStr; use std::hash::Hash; use std::ops::Deref; use std::path::Path; +use std::str::{self, Utf8Error}; use std::{borrow::Cow, fmt::Display, str::Chars}; use serde::de::{Deserializer, Visitor}; @@ -37,6 +38,14 @@ impl Ord for NixString { } } +impl TryFrom<&[u8]> for NixString { + type Error = Utf8Error; + + fn try_from(value: &[u8]) -> Result { + Ok(Self(Box::from(str::from_utf8(value)?))) + } +} + impl From<&str> for NixString { fn from(s: &str) -> Self { NixString(Box::from(s)) -- cgit 1.4.1