1// SPDX-FileCopyrightText: 2026 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: MIT
4
5use crate::{imports::iterator_next, ptr::string_to_ptr};
6use serde::de::DeserializeOwned;
7use std::marker::PhantomData;
8
9pub struct Iterator<T> {
10 name: String,
11 marker: PhantomData<T>,
12}
13
14impl<T> Iterator<T> {
15 pub fn new<S>(name: S) -> Self
16 where
17 S: Into<String>,
18 {
19 Iterator {
20 name: name.into(),
21 marker: PhantomData,
22 }
23 }
24}
25
26impl<T> std::iter::Iterator for Iterator<T>
27where
28 T: DeserializeOwned,
29{
30 type Item = Result<T, String>;
31
32 fn next(&mut self) -> Option<Self::Item> {
33 let (name_ptr, size_ptr) = string_to_ptr(&self.name);
34 let raw_item = match iterator_next(name_ptr, size_ptr) {
35 Ok(data) => data,
36 Err(err) => return Some(Err(err)),
37 };
38
39 if !raw_item.exist {
40 return None;
41 }
42
43 Some(
44 serde_json::from_str::<T>(&raw_item.item).map_err(|err| format!("JSON invalid: {err}")),
45 )
46 }
47}