LCOV - code coverage report
Current view: top level - proxy/src - parse.rs (source / functions) Coverage Total Hit
Test: 2aa98e37cd3250b9a68c97ef6050b16fe702ab33.info Lines: 100.0 % 26 26
Test Date: 2024-08-29 11:33:10 Functions: 100.0 % 9 9

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

Generated by: LCOV version 2.1-beta