feat(tvix/eval): implement serde::Deserialize for Value
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
This commit is contained in:
parent
c011a6130c
commit
805219a2fa
10 changed files with 114 additions and 50 deletions
|
|
@ -8,6 +8,8 @@
|
|||
use std::iter::FromIterator;
|
||||
|
||||
use imbl::{ordmap, OrdMap};
|
||||
use serde::de::{Deserializer, Error, Visitor};
|
||||
use serde::Deserialize;
|
||||
|
||||
use crate::errors::ErrorKind;
|
||||
use crate::vm::VM;
|
||||
|
|
@ -20,7 +22,7 @@ use super::Value;
|
|||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
enum AttrsRep {
|
||||
Empty,
|
||||
|
||||
|
|
@ -138,6 +140,39 @@ impl TotalDisplay for NixAttrs {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for NixAttrs {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
struct MapVisitor;
|
||||
|
||||
impl<'de> Visitor<'de> for MapVisitor {
|
||||
type Value = NixAttrs;
|
||||
|
||||
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
formatter.write_str("a valid Nix attribute set")
|
||||
}
|
||||
|
||||
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
|
||||
where
|
||||
A: serde::de::MapAccess<'de>,
|
||||
{
|
||||
let mut stack_array = Vec::with_capacity(map.size_hint().unwrap_or(0) * 2);
|
||||
|
||||
while let Some((key, value)) = map.next_entry()? {
|
||||
stack_array.push(key);
|
||||
stack_array.push(value);
|
||||
}
|
||||
|
||||
NixAttrs::construct(stack_array.len() / 2, stack_array).map_err(A::Error::custom)
|
||||
}
|
||||
}
|
||||
|
||||
deserializer.deserialize_map(MapVisitor)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "arbitrary")]
|
||||
mod arbitrary {
|
||||
use super::*;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue