diff --git a/Cargo.lock b/Cargo.lock index 81338e1..3637256 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,30 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "getrandom" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi", -] - [[package]] name = "grid" version = "0.17.0" @@ -38,15 +14,8 @@ version = "0.1.1" dependencies = [ "grid", "thiserror", - "uuid", ] -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - [[package]] name = "proc-macro2" version = "1.0.95" @@ -65,12 +34,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - [[package]] name = "syn" version = "2.0.101" @@ -107,30 +70,3 @@ name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "uuid" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" -dependencies = [ - "getrandom", -] - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] diff --git a/Cargo.toml b/Cargo.toml index ec096e6..1234802 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,4 +14,3 @@ license = "MIT" [dependencies] grid = "0.17.0" thiserror = "2.0.12" -uuid = { version = "1.10.0", features = ["v4"] } diff --git a/README.md b/README.md index 34d35d1..bf599a1 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ A flexible and efficient Rust library for managing 2D grid-based layouts with automatic collision handling and dynamic vertical expansion. +PS: This crate is on the early stages of development, so expect breaking changes and limited documentation. + ## Features - 🎯 Automatic collision detection and resolution @@ -33,6 +35,7 @@ The main components of the library are: - Error types for robust error handling For detailed API documentation, run: + ```bash cargo doc --open ``` @@ -72,4 +75,4 @@ at your option. ## Acknowledgments -- Built with the [grid](https://crates.io/crates/grid) crate for efficient grid operations \ No newline at end of file +- Built with the [grid](https://crates.io/crates/grid) crate for efficient grid operations diff --git a/examples/managing_grid.rs b/examples/managing_grid.rs index fa6d496..36f2464 100644 --- a/examples/managing_grid.rs +++ b/examples/managing_grid.rs @@ -50,14 +50,14 @@ fn print_grid(grid: &GridEngine) { println!("{}", grid_str_formatted); } -fn main() { +fn main() -> Result<(), Box> { println!("Grid App"); let mut grid = GridEngine::new(10, 12); grid.events_mut().add_changes_listener(|event| { println!("Event triggered: {:#?}", event); - }); + })?; grid.add_item("a".to_string(), 2, 2, 2, 4).unwrap(); print_grid(&grid); @@ -69,4 +69,6 @@ fn main() { print_grid(&grid); grid.move_item("a", 1, 0).unwrap(); print_grid(&grid); + + Ok(()) } diff --git a/src/error.rs b/src/error.rs index a3ef218..ae39ec4 100644 --- a/src/error.rs +++ b/src/error.rs @@ -30,3 +30,9 @@ pub enum ItemError { #[error("Item already exists: {id}")] ItemAlreadyExists { id: String }, } + +#[derive(Error, Debug)] +pub enum GridEventError { + #[error("Failed to generate listener id")] + ListenerIdNotGenerated, +} diff --git a/src/grid_events.rs b/src/grid_events.rs index 14ea762..7929456 100644 --- a/src/grid_events.rs +++ b/src/grid_events.rs @@ -41,8 +41,11 @@ //! // The listener will be notified automatically //! ``` -use crate::grid_engine::Change; -use std::fmt::Debug; +use crate::{error::GridEventError, grid_engine::Change}; +use std::{ + fmt::Debug, + sync::{Arc, Mutex}, +}; /// Event data structure containing information about grid changes. /// @@ -117,6 +120,7 @@ impl Debug for ListenerFunction { /// and remove listeners, as well as trigger events when changes happen. #[derive(Debug, Default)] pub struct GridEvents { + listener_id_counter: Arc>, /// Collection of registered change event listeners changes_listeners: Vec, } @@ -149,12 +153,22 @@ impl GridEvents { pub fn add_changes_listener( &mut self, function: impl Fn(&ChangesEventValue) + Send + 'static + Sync, - ) -> String { - let id = uuid::Uuid::new_v4().to_string(); + ) -> Result { + let id = { + let mut counter = match self.listener_id_counter.lock() { + Ok(counter) => counter, + Err(_) => { + return Err(GridEventError::ListenerIdNotGenerated); + } + }; + *counter += 1; + format!("l_{}", counter) + }; + let listener = ListenerFunction::new(id.clone(), Box::new(function)); self.changes_listeners.push(listener); - id + Ok(id) } /// Removes a previously registered change event listener. @@ -167,13 +181,18 @@ impl GridEvents { /// /// ``` /// use grid_engine::grid_engine::GridEngine; + /// use std::error::Error; + /// + /// # fn main() -> Result<(), Box> { /// /// let mut grid = GridEngine::new(10, 10); - /// let listener_id = grid.events_mut().add_changes_listener(|_| {}); + /// let listener_id = grid.events_mut().add_changes_listener(|_| {})?; /// let removed = grid.events_mut().remove_changes_listener(&listener_id); // Listener removed /// /// assert!(removed.is_some()); /// + /// # Ok(()) + /// # } /// ``` pub fn remove_changes_listener(&mut self, id: &str) -> Option { if let Some(pos) = self @@ -212,7 +231,7 @@ mod tests { #[test] fn test_add_changes_listener() { let mut events = GridEvents::default(); - let listener_id = events.add_changes_listener(|_| {}); + let listener_id = events.add_changes_listener(|_| {}).unwrap(); assert_eq!(events.changes_listeners.len(), 1); assert!(!listener_id.is_empty()); @@ -221,7 +240,7 @@ mod tests { #[test] fn test_remove_changes_listener() { let mut events = GridEvents::default(); - let listener_id = events.add_changes_listener(|_| {}); + let listener_id = events.add_changes_listener(|_| {}).unwrap(); events.remove_changes_listener(&listener_id); assert_eq!(events.changes_listeners.len(), 0); @@ -230,10 +249,14 @@ mod tests { #[test] fn test_multiple_listeners() { let mut events = GridEvents::default(); - let _id1 = events.add_changes_listener(|_| {}); - let _id2 = events.add_changes_listener(|_| {}); - - assert_eq!(events.changes_listeners.len(), 2); + let _id1 = events.add_changes_listener(|_| {}).unwrap(); + let _id2 = events.add_changes_listener(|_| {}).unwrap(); + let _id3 = events.add_changes_listener(|_| {}).unwrap(); + + assert_eq!(events.changes_listeners.len(), 3); + assert_ne!(_id1, _id2); + assert_ne!(_id2, _id3); + assert_ne!(_id1, _id3); } #[test] @@ -242,10 +265,12 @@ mod tests { let counter = Arc::new(Mutex::new(0)); let counter_clone = counter.clone(); - events.add_changes_listener(move |_| { - let mut count = counter_clone.lock().unwrap(); - *count += 1; - }); + events + .add_changes_listener(move |_| { + let mut count = counter_clone.lock().unwrap(); + *count += 1; + }) + .unwrap(); let changes = ChangesEventValue { changes: vec![] }; events.trigger_changes_event(&changes); @@ -261,10 +286,12 @@ mod tests { // Add two listeners that increment the same counter for _ in 0..2 { let counter_clone = counter.clone(); - events.add_changes_listener(move |_| { - let mut count = counter_clone.lock().unwrap(); - *count += 1; - }); + events + .add_changes_listener(move |_| { + let mut count = counter_clone.lock().unwrap(); + *count += 1; + }) + .unwrap(); } let changes = ChangesEventValue { changes: vec![] }; @@ -279,10 +306,12 @@ mod tests { let received_changes = Arc::new(Mutex::new(Vec::new())); let received_changes_clone = received_changes.clone(); - events.add_changes_listener(move |event| { - let mut changes = received_changes_clone.lock().unwrap(); - changes.extend(event.changes.clone()); - }); + events + .add_changes_listener(move |event| { + let mut changes = received_changes_clone.lock().unwrap(); + changes.extend(event.changes.clone()); + }) + .unwrap(); // Create a mock change let node = crate::node::Node::new("test".to_string(), 0, 0, 1, 1);