feat(tvix/eval): implement attribute set equality
Change-Id: Ia25f02610f2575e5e7fca81643e05b40f4a07820 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6200 Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI
This commit is contained in:
		
							parent
							
								
									2ea71aa4c3
								
							
						
					
					
						commit
						c4f73eecdc
					
				
					 1 changed files with 48 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -95,8 +95,54 @@ impl Display for NixAttrs {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
impl PartialEq for NixAttrs {
 | 
			
		||||
    fn eq(&self, _other: &Self) -> bool {
 | 
			
		||||
        todo!("attrset equality")
 | 
			
		||||
    fn eq(&self, other: &Self) -> bool {
 | 
			
		||||
        match (&self.0, &other.0) {
 | 
			
		||||
            (AttrsRep::Empty, AttrsRep::Empty) => true,
 | 
			
		||||
 | 
			
		||||
            // It is possible to create an empty attribute set that
 | 
			
		||||
            // has Map representation like so: ` { ${null} = 1; }`.
 | 
			
		||||
            //
 | 
			
		||||
            // Preventing this would incur a cost on all attribute set
 | 
			
		||||
            // construction (we'd have to check the actual number of
 | 
			
		||||
            // elements after key construction). In practice this
 | 
			
		||||
            // probably does not happen, so it's better to just bite
 | 
			
		||||
            // the bullet and implement this branch.
 | 
			
		||||
            (AttrsRep::Empty, AttrsRep::Map(map)) | (AttrsRep::Map(map), AttrsRep::Empty) => {
 | 
			
		||||
                map.is_empty()
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Other specialised representations (KV ...) definitely
 | 
			
		||||
            // do not match `Empty`.
 | 
			
		||||
            (AttrsRep::Empty, _) | (_, AttrsRep::Empty) => false,
 | 
			
		||||
 | 
			
		||||
            (
 | 
			
		||||
                AttrsRep::KV {
 | 
			
		||||
                    name: n1,
 | 
			
		||||
                    value: v1,
 | 
			
		||||
                },
 | 
			
		||||
                AttrsRep::KV {
 | 
			
		||||
                    name: n2,
 | 
			
		||||
                    value: v2,
 | 
			
		||||
                },
 | 
			
		||||
            ) => n1 == n2 && v1 == v2,
 | 
			
		||||
 | 
			
		||||
            (AttrsRep::Map(map), AttrsRep::KV { name, value })
 | 
			
		||||
            | (AttrsRep::KV { name, value }, AttrsRep::Map(map)) => {
 | 
			
		||||
                if map.len() != 2 {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if let (Some(m_name), Some(m_value)) =
 | 
			
		||||
                    (map.get(&NixString::NAME), map.get(&NixString::VALUE))
 | 
			
		||||
                {
 | 
			
		||||
                    return name == m_name && value == m_value;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                false
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            (AttrsRep::Map(m1), AttrsRep::Map(m2)) => m1 == m2,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue