use core::ffi::{c_char, CStr};
use core::marker::PhantomData;
use core::ptr;
use nwep_sys as sys;
pub struct Headers<'a> {
msg: *const sys::nwep_message,
next: usize,
count: usize,
_life: PhantomData<&'a ()>,
}
impl<'a> Headers<'a> {
pub(crate) fn new(msg: *const sys::nwep_message) -> Headers<'a> {
let count = unsafe { sys::nwep_message_header_count(msg) };
Headers {
msg,
next: 0,
count,
_life: PhantomData,
}
}
}
impl<'a> Iterator for Headers<'a> {
type Item = (&'a str, &'a str);
fn next(&mut self) -> Option<(&'a str, &'a str)> {
if self.next >= self.count {
return None;
}
let i = self.next;
self.next += 1;
let mut name: *const c_char = ptr::null();
let mut value: *const c_char = ptr::null();
let rc = unsafe { sys::nwep_message_header_at(self.msg, i, &mut name, &mut value) };
if rc != 0 || name.is_null() || value.is_null() {
return Some(("", ""));
}
let k = unsafe { CStr::from_ptr(name) }.to_str().unwrap_or("");
let v = unsafe { CStr::from_ptr(value) }.to_str().unwrap_or("");
Some((k, v))
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.count - self.next;
(remaining, Some(remaining))
}
}
impl ExactSizeIterator for Headers<'_> {}