GitRoot

Craft your forge // Build your project // Grow your community freely
 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}