diff options
author | Ryan Lahfa <tvl@lahfa.xyz> | 2022-12-24T17·18+0100 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2023-01-10T09·53+0000 |
commit | 805219a2fad0edac10d046fc5ad5820edb4482ee (patch) | |
tree | 2ab7e081c93910875071fc74ad709a2bbc400217 /tvix/eval/src/value/string.rs | |
parent | c011a6130cd4f0486539f8e98f0aef5d64e32d90 (diff) |
feat(tvix/eval): implement serde::Deserialize for Value r/5640
Co-Authored-By: Vincent Ambo <tazjin@tvl.su> Change-Id: Ib6f7d1f4f4faac36b44f5f75cccc57bf912cf606 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7626 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/eval/src/value/string.rs')
-rw-r--r-- | tvix/eval/src/value/string.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/tvix/eval/src/value/string.rs b/tvix/eval/src/value/string.rs index 9ebdf687d284..93cbc98dab9c 100644 --- a/tvix/eval/src/value/string.rs +++ b/tvix/eval/src/value/string.rs @@ -8,6 +8,9 @@ use std::ops::Deref; use std::path::Path; use std::{borrow::Cow, fmt::Display, str::Chars}; +use serde::de::{Deserializer, Visitor}; +use serde::Deserialize; + #[derive(Clone, Debug)] enum StringRepr { Smol(SmolStr), @@ -68,6 +71,39 @@ impl Hash for NixString { } } +impl<'de> Deserialize<'de> for NixString { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where + D: Deserializer<'de>, + { + struct StringVisitor; + + impl<'de> Visitor<'de> for StringVisitor { + type Value = NixString; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a valid Nix string") + } + + fn visit_string<E>(self, v: String) -> Result<Self::Value, E> + where + E: serde::de::Error, + { + Ok(v.into()) + } + + fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> + where + E: serde::de::Error, + { + Ok(v.into()) + } + } + + deserializer.deserialize_string(StringVisitor) + } +} + #[cfg(feature = "arbitrary")] mod arbitrary { use super::*; |