From f6e7bbd7a56aec3272073500cd3e6c2115a27d7b Mon Sep 17 00:00:00 2001 From: oiupoyt Date: Thu, 1 Oct 2026 07:32:19 +0530 Subject: [PATCH] feat(assets): implement AssetDir directory iterator with rewind support --- crates/molotov-core/src/assets/dir.rs | 31 +++++++++++++++++++++ crates/molotov-core/src/assets/mod.rs | 1 + crates/molotov-core/tests/asset_dir_test.rs | 22 +++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 crates/molotov-core/src/assets/dir.rs create mode 100644 crates/molotov-core/tests/asset_dir_test.rs diff --git a/crates/molotov-core/src/assets/dir.rs b/crates/molotov-core/src/assets/dir.rs new file mode 100644 index 0000000..5e568dc --- /dev/null +++ b/crates/molotov-core/src/assets/dir.rs @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +use std::ffi::CString; + +pub struct AssetDir { + entries: Vec, + cursor: usize, +} + +impl AssetDir { + pub fn new(filenames: Vec) -> Self { + let entries = filenames + .into_iter() + .filter_map(|s| CString::new(s).ok()) + .collect(); + Self { entries, cursor: 0 } + } + + pub fn get_next_filename(&mut self) -> *const libc::c_char { + if self.cursor < self.entries.len() { + let ptr = self.entries[self.cursor].as_ptr(); + self.cursor += 1; + ptr + } else { + std::ptr::null() + } + } + + pub fn rewind(&mut self) { + self.cursor = 0; + } +} diff --git a/crates/molotov-core/src/assets/mod.rs b/crates/molotov-core/src/assets/mod.rs index ebdd1a4..897866a 100644 --- a/crates/molotov-core/src/assets/mod.rs +++ b/crates/molotov-core/src/assets/mod.rs @@ -1,3 +1,4 @@ // SPDX-License-Identifier: GPL-3.0-or-later pub mod asset; +pub mod dir; pub mod types; diff --git a/crates/molotov-core/tests/asset_dir_test.rs b/crates/molotov-core/tests/asset_dir_test.rs new file mode 100644 index 0000000..7f4190e --- /dev/null +++ b/crates/molotov-core/tests/asset_dir_test.rs @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +use molotov_core::assets::dir::AssetDir; +use std::ffi::CStr; + +#[test] +fn test_asset_dir_iteration_and_rewind() { + let files = vec!["font.ttf".to_string(), "cursor.png".to_string(), "sound.ogg".to_string()]; + let mut dir = AssetDir::new(files); + + unsafe { + let f1 = dir.get_next_filename(); + assert!(!f1.is_null()); + assert_eq!(CStr::from_ptr(f1).to_str().unwrap(), "font.ttf"); + + let f2 = dir.get_next_filename(); + assert_eq!(CStr::from_ptr(f2).to_str().unwrap(), "cursor.png"); + + dir.rewind(); + let f1_again = dir.get_next_filename(); + assert_eq!(CStr::from_ptr(f1_again).to_str().unwrap(), "font.ttf"); + } +}