Skip to content

Commit 766d31d

Browse files
refactor: apply rust api guidelines (#2)
* refactor: apply rust api guidelines * docs: improve docs * refactor: adjust pub * refactor: adjust clippy issue * refactor: adjust clippy issue
1 parent 641ff12 commit 766d31d

10 files changed

Lines changed: 260 additions & 47 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
/target
2+
.local

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ edition = "2024"
55
authors = ["Thiago Ramos"]
66
description = "A flexible and efficient library for managing 2D grid-based layouts with automatic collision handling and dynamic vertical expansion"
77
documentation = "https://docs.rs/grid-engine"
8-
homepage = "https://github.com/thiagodejesus/grid-engine"
98
repository = "https://github.com/thiagodejesus/grid-engine"
109
readme = "README.md"
1110
keywords = ["grid", "layout", "collision", "2d", "dashboard"]
File renamed without changes.

examples/managing_grid.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ fn main() {
5555

5656
let mut grid = GridEngine::new(10, 12);
5757

58-
grid.events.add_changes_listener(Box::new(|event| {
58+
grid.events_mut().add_changes_listener(Box::new(|event| {
5959
println!("Event triggered: {:#?}", event);
6060
}));
6161

src/grid_engine.rs

Lines changed: 162 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,22 @@
3030
//!
3131
//! ```
3232
//! use grid_engine::grid_engine::GridEngine;
33+
//! # use std::error::Error;
3334
//!
35+
//! # fn main() -> Result<(), Box<dyn Error>> {
3436
//! let mut grid = GridEngine::new(10, 12);
3537
//!
3638
//! // Add items to the grid
37-
//! grid.add_item("item1".to_string(), 2, 2, 2, 4).unwrap();
39+
//! grid.add_item("item1".to_string(), 2, 2, 2, 4)?;
3840
//!
3941
//! // Move items (handles collisions automatically)
40-
//! grid.move_item("item1", 4, 4).unwrap();
42+
//! grid.move_item("item1", 4, 4)?;
4143
//!
4244
//! // Remove items
43-
//! grid.remove_item("item1").unwrap();
45+
//! grid.remove_item("item1")?;
46+
//! #
47+
//! # Ok(())
48+
//! # }
4449
//! ```
4550
4651
use crate::error::{GridEngineError, InnerGridError, ItemError};
@@ -54,23 +59,92 @@ use std::{collections::BTreeMap, fmt::Debug};
5459
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
5560
pub struct AddChangeData {
5661
/// The node being added to the grid
57-
pub value: Node,
62+
value: Node,
63+
}
64+
65+
impl AddChangeData {
66+
/// Creates a new AddChangeData instance
67+
///
68+
/// # Arguments
69+
///
70+
/// * `value` - The node being added to the grid
71+
///
72+
/// # Returns
73+
///
74+
/// A new instance of AddChangeData
75+
pub fn new(value: Node) -> Self {
76+
Self { value }
77+
}
78+
79+
/// Returns the node being added
80+
pub fn value(&self) -> &Node {
81+
&self.value
82+
}
5883
}
5984

6085
/// Represents data for an item removal change
6186
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
6287
pub struct RemoveChangeData {
6388
/// The node being removed from the grid
64-
pub value: Node,
89+
value: Node,
90+
}
91+
92+
impl RemoveChangeData {
93+
/// Creates a new RemoveChangeData instance
94+
///
95+
/// # Arguments
96+
///
97+
/// * `value` - The node being removed from the grid
98+
///
99+
/// # Returns
100+
///
101+
/// A new instance of RemoveChangeData
102+
pub fn new(value: Node) -> Self {
103+
Self { value }
104+
}
105+
106+
/// Returns the node being removed
107+
pub fn value(&self) -> &Node {
108+
&self.value
109+
}
65110
}
66111

67112
/// Represents data for an item movement change
68113
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
69114
pub struct MoveChangeData {
70115
/// The original state of the node
71-
pub old_value: Node,
116+
old_value: Node,
72117
/// The new state of the node after movement
73-
pub new_value: Node,
118+
new_value: Node,
119+
}
120+
121+
impl MoveChangeData {
122+
/// Creates a new MoveChangeData instance
123+
///
124+
/// # Arguments
125+
///
126+
/// * `old_value` - The original state of the node
127+
/// * `new_value` - The new state of the node after movement
128+
///
129+
/// # Returns
130+
///
131+
/// A new instance of MoveChangeData
132+
pub fn new(old_value: Node, new_value: Node) -> Self {
133+
Self {
134+
old_value,
135+
new_value,
136+
}
137+
}
138+
139+
/// Returns the original state of the node
140+
pub fn old_value(&self) -> &Node {
141+
&self.old_value
142+
}
143+
144+
/// Returns the new state of the node after movement
145+
pub fn new_value(&self) -> &Node {
146+
&self.new_value
147+
}
74148
}
75149

76150
/// Represents different types of changes that can occur in the grid
@@ -104,7 +178,7 @@ pub struct GridEngine {
104178
/// Changes waiting to be applied
105179
pending_changes: Vec<Change>,
106180
/// Event system for tracking grid changes
107-
pub events: GridEvents,
181+
events: GridEvents,
108182
}
109183

110184
impl GridEngine {
@@ -131,16 +205,36 @@ impl GridEngine {
131205
}
132206
}
133207

208+
/// Creates a new node with the specified parameters.
134209
fn new_node(&mut self, id: String, x: usize, y: usize, w: usize, h: usize) -> Node {
135210
Node::new(id, x, y, w, h)
136211
}
137212

213+
/// Creates a change operation to add a new node to the grid.
138214
fn create_add_change(&mut self, node: Node) {
139215
self.pending_changes
140216
.push(Change::Add(AddChangeData { value: node }));
141217
}
142218

143219
/// Get the nodes sorted by id
220+
///
221+
/// # Example
222+
///
223+
/// ```
224+
/// use grid_engine::grid_engine::GridEngine;
225+
///
226+
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
227+
/// let mut grid = GridEngine::new(10, 10);
228+
/// grid.add_item("b".to_string(), 0, 0, 2, 2).unwrap();
229+
/// grid.add_item("a".to_string(), 0, 2, 2, 2).unwrap();
230+
///
231+
/// let nodes = grid.get_nodes();
232+
/// assert_eq!(nodes.len(), 2);
233+
/// assert_eq!(nodes[0].id(), "a");
234+
/// assert_eq!(nodes[1].id(), "b");
235+
/// # Ok(())
236+
/// # }
237+
/// ```
144238
pub fn get_nodes(&self) -> Vec<Node> {
145239
let mut cloned: Vec<Node> = self.items.values().cloned().collect();
146240
// Would be better to sort by some created_at
@@ -157,6 +251,20 @@ impl GridEngine {
157251
/// # Returns
158252
///
159253
/// A reference to the InnerGrid instance
254+
///
255+
/// # Example
256+
///
257+
/// ```
258+
/// use grid_engine::grid_engine::GridEngine;
259+
/// use std::error::Error;
260+
///
261+
/// # fn main() -> Result<(), Box<dyn Error>> {
262+
/// let grid = GridEngine::new(10, 10);
263+
/// let inner_grid = grid.get_inner_grid();
264+
/// assert_eq!(inner_grid.rows(), 10);
265+
/// assert_eq!(inner_grid.cols(), 10);
266+
/// # Ok(())
267+
/// # }
160268
pub fn get_inner_grid(&self) -> &InnerGrid {
161269
&self.grid
162270
}
@@ -183,9 +291,19 @@ impl GridEngine {
183291
///
184292
/// ```
185293
/// use grid_engine::grid_engine::GridEngine;
294+
/// use std::error::Error;
186295
///
296+
/// # fn main() -> Result<(), Box<dyn Error>> {
187297
/// let mut grid = GridEngine::new(10, 10);
188-
/// grid.add_item("box1".to_string(), 0, 0, 2, 2).unwrap(); // 2x2 item at top-left
298+
/// grid.add_item("box1".to_string(), 0, 0, 2, 2)?; // 2x2 item at top-left
299+
///
300+
/// // Check if the item was added correctly
301+
/// let item = grid.get_nodes();
302+
/// assert_eq!(item.len(), 1);
303+
/// assert_eq!(item[0].id(), "box1");
304+
///
305+
/// # Ok(())
306+
/// # }
189307
/// ```
190308
pub fn add_item(
191309
&mut self,
@@ -239,10 +357,16 @@ impl GridEngine {
239357
///
240358
/// ```
241359
/// use grid_engine::grid_engine::GridEngine;
360+
/// use std::error::Error;
361+
///
362+
/// # fn main() -> Result<(), Box<dyn Error>> {
242363
///
243364
/// let mut grid = GridEngine::new(10, 10);
244-
/// grid.add_item("box1".to_string(), 0, 0, 2, 2).unwrap();
245-
/// grid.remove_item("box1").unwrap(); // Removes the item
365+
/// grid.add_item("box1".to_string(), 0, 0, 2, 2)?;
366+
/// grid.remove_item("box1")?; // Removes the item
367+
///
368+
/// # Ok(())
369+
/// # }
246370
/// ```
247371
pub fn remove_item(&mut self, id: &str) -> Result<Node, GridEngineError> {
248372
let node = match self.items.get(id) {
@@ -409,10 +533,23 @@ impl GridEngine {
409533
///
410534
/// ```
411535
/// use grid_engine::grid_engine::GridEngine;
536+
/// # use std::error::Error;
537+
///
538+
/// # fn main() -> Result<(), Box<dyn Error>> {
412539
///
413540
/// let mut grid = GridEngine::new(10, 10);
414-
/// grid.add_item("box1".to_string(), 0, 0, 2, 2).unwrap();
415-
/// grid.move_item("box1", 2, 2).unwrap(); // Moves box to position 2,2
541+
/// grid.add_item("box1".to_string(), 0, 0, 2, 2)?;
542+
/// grid.move_item("box1", 2, 2)?; // Moves box to position 2,2
543+
///
544+
/// // Check if the item was moved correctly
545+
/// let item = grid.get_nodes();
546+
/// assert_eq!(item.len(), 1);
547+
/// assert_eq!(item[0].x(), &2);
548+
/// assert_eq!(item[0].y(), &2);
549+
///
550+
/// # Ok(())
551+
/// # }
552+
///
416553
/// ```
417554
pub fn move_item(
418555
&mut self,
@@ -483,11 +620,20 @@ impl GridEngine {
483620
}
484621
}
485622

486-
self.events.trigger_changes_event(&ChangesEventValue {
487-
changes: changes.to_vec(),
488-
});
623+
self.events
624+
.trigger_changes_event(&ChangesEventValue::new(changes.to_vec()));
489625
Ok(())
490626
}
627+
628+
/// Returns a reference to the grid events system.
629+
pub fn events(&self) -> &GridEvents {
630+
&self.events
631+
}
632+
633+
/// Returns a mutable reference to the grid events system.
634+
pub fn events_mut(&mut self) -> &mut GridEvents {
635+
&mut self.events
636+
}
491637
}
492638

493639
mod tests {

0 commit comments

Comments
 (0)