LCOV - code coverage report
Current view: top level - proxy/src - parse.rs (source / functions) Coverage Total Hit
Test: c639aa5f7ab62b43d647b10f40d15a15686ce8a9.info Lines: 100.0 % 28 28
Test Date: 2024-02-12 20:26:03 Functions: 100.0 % 11 11

            Line data    Source code
       1              : //! Small parsing helpers.
       2              : 
       3              : use std::ffi::CStr;
       4              : 
       5           71 : pub fn split_cstr(bytes: &[u8]) -> Option<(&CStr, &[u8])> {
       6           71 :     let cstr = CStr::from_bytes_until_nul(bytes).ok()?;
       7           67 :     let (_, other) = bytes.split_at(cstr.to_bytes_with_nul().len());
       8           67 :     Some((cstr, other))
       9           71 : }
      10              : 
      11              : /// See <https://doc.rust-lang.org/std/primitive.slice.html#method.split_array_ref>.
      12           69 : pub fn split_at_const<const N: usize>(bytes: &[u8]) -> Option<(&[u8; N], &[u8])> {
      13           69 :     (bytes.len() >= N).then(|| {
      14           67 :         let (head, tail) = bytes.split_at(N);
      15           67 :         (head.try_into().unwrap(), tail)
      16           69 :     })
      17           69 : }
      18              : 
      19              : #[cfg(test)]
      20              : mod tests {
      21              :     use super::*;
      22              : 
      23            2 :     #[test]
      24            2 :     fn test_split_cstr() {
      25            2 :         assert!(split_cstr(b"").is_none());
      26            2 :         assert!(split_cstr(b"foo").is_none());
      27              : 
      28            2 :         let (cstr, rest) = split_cstr(b"\0").expect("uh-oh");
      29            2 :         assert_eq!(cstr.to_bytes(), b"");
      30            2 :         assert_eq!(rest, b"");
      31              : 
      32            2 :         let (cstr, rest) = split_cstr(b"foo\0bar").expect("uh-oh");
      33            2 :         assert_eq!(cstr.to_bytes(), b"foo");
      34            2 :         assert_eq!(rest, b"bar");
      35            2 :     }
      36              : 
      37            2 :     #[test]
      38            2 :     fn test_split_at_const() {
      39            2 :         assert!(split_at_const::<0>(b"").is_some());
      40            2 :         assert!(split_at_const::<1>(b"").is_none());
      41            2 :         assert!(matches!(split_at_const::<1>(b"ok"), Some((b"o", b"k"))));
      42            2 :     }
      43              : }
        

Generated by: LCOV version 2.1-beta