• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

davidcole1340 / ext-php-rs / 16429134897

21 Jul 2025 10:01PM UTC coverage: 27.026% (-0.1%) from 27.144%
16429134897

Pull #535

github

web-flow
Merge 45a3cbccf into 6869625f4
Pull Request #535: feat(array): introducing BTreeMap conversion and refactoring HashMap conversion

3 of 24 new or added lines in 3 files covered. (12.5%)

92 existing lines in 2 files now uncovered.

1127 of 4170 relevant lines covered (27.03%)

5.74 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/types/array/conversions/hash_map.rs
1
use super::super::ZendHashTable;
2
use crate::types::ArrayKey;
3
use crate::{
4
    boxed::ZBox,
5
    convert::{FromZval, IntoZval},
6
    error::{Error, Result},
7
    flags::DataType,
8
    types::Zval,
9
};
10
use std::hash::{BuildHasher, Hash};
11
use std::{collections::HashMap, convert::TryFrom};
12

13
impl<'a, K, V, H> TryFrom<&'a ZendHashTable> for HashMap<K, V, H>
14
where
15
    K: TryFrom<ArrayKey<'a>, Error = Error> + Eq + Hash,
16
    V: FromZval<'a>,
17
    H: BuildHasher + Default,
18
{
19
    type Error = Error;
20

21
    fn try_from(value: &'a ZendHashTable) -> Result<Self> {
×
NEW
22
        let mut hm = Self::with_capacity_and_hasher(value.len(), H::default());
×
23

24
        for (key, val) in value {
×
25
            hm.insert(
×
NEW
26
                key.try_into()?,
×
27
                V::from_zval(val).ok_or_else(|| Error::ZvalConversion(val.get_type()))?,
×
28
            );
29
        }
30

31
        Ok(hm)
×
32
    }
33
}
34

35
impl<K, V, H> TryFrom<HashMap<K, V, H>> for ZBox<ZendHashTable>
36
where
37
    K: AsRef<str>,
38
    V: IntoZval,
39
    H: BuildHasher,
40
{
41
    type Error = Error;
42

NEW
43
    fn try_from(value: HashMap<K, V, H>) -> Result<Self> {
×
44
        let mut ht = ZendHashTable::with_capacity(
45
            value.len().try_into().map_err(|_| Error::IntegerOverflow)?,
×
46
        );
47

48
        for (k, v) in value {
×
49
            ht.insert(k.as_ref(), v)?;
×
50
        }
51

52
        Ok(ht)
×
53
    }
54
}
55

56
impl<K, V, H> IntoZval for HashMap<K, V, H>
57
where
58
    K: AsRef<str>,
59
    V: IntoZval,
60
    H: BuildHasher,
61
{
62
    const TYPE: DataType = DataType::Array;
63
    const NULLABLE: bool = false;
64

65
    fn set_zval(self, zv: &mut Zval, _: bool) -> Result<()> {
×
66
        let arr = self.try_into()?;
×
67
        zv.set_hashtable(arr);
×
68
        Ok(())
×
69
    }
70
}
71

72
impl<'a, V, H> FromZval<'a> for HashMap<String, V, H>
73
where
74
    V: FromZval<'a>,
75
    H: BuildHasher + Default,
76
{
77
    const TYPE: DataType = DataType::Array;
78

79
    fn from_zval(zval: &'a Zval) -> Option<Self> {
×
80
        zval.array().and_then(|arr| arr.try_into().ok())
×
81
    }
82
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc