use super::*;
use crate::option_iteration::{OptItem, OptPayloadReader};
pub struct OptionsIter<'a>(
pub(crate) OptPayloadReader<'a>,
pub(crate) Option<&'a core::cell::Cell<Option<Processing>>>,
);
pub const OPTION_INVALID: u16 = u16::MAX;
impl<'a> Iterator for OptionsIter<'a> {
type Item = MessageOption<'a>;
fn next(&mut self) -> Option<MessageOption<'a>> {
let (new_cache, result) = match self.0.next() {
Some(OptItem::Option { number, data }) => (
None,
Some(MessageOption {
number,
value: data,
}),
),
Some(OptItem::Error { .. }) => (
Some(Processing::Error),
Some(MessageOption {
number: OPTION_INVALID,
value: &[],
}),
),
Some(OptItem::Payload(p)) => (Some(Processing::OkPayloadLength(p.len())), None),
None => (Some(Processing::OkNoPayload), None),
};
if let (Some(new_value), Some(cache)) = (new_cache, self.1) {
if cache.get().is_none() {
cache.set(Some(new_value));
}
}
result
}
}
pub struct MessageOption<'a> {
number: u16,
value: &'a [u8],
}
impl coap_message::MessageOption for MessageOption<'_> {
fn number(&self) -> u16 {
self.number
}
fn value(&self) -> &[u8] {
self.value
}
}