sbd/storage/mod.rs
1//! Squirrel away SBD messages and retrieve them later.
2
3mod filesystem;
4mod memory;
5
6pub use self::{filesystem::Storage as FilesystemStorage, memory::Storage as MemoryStorage};
7use crate::{mo::Message, Error};
8
9/// Basic storage operations.
10pub trait Storage {
11 /// Stores a message, consuming it.
12 ///
13 /// # Examples
14 ///
15 /// ```
16 /// # use sbd::mo::Message;
17 /// # use sbd::storage::{Storage, MemoryStorage};
18 /// let message = Message::from_path("data/0-mo.sbd").unwrap();
19 /// let mut storage = MemoryStorage::new();
20 /// storage.store(message);
21 /// ```
22 fn store(&mut self, message: Message) -> Result<(), Error>;
23
24 /// Retrieves all messages in this storage as a vector.
25 ///
26 /// # Examples
27 ///
28 /// ```
29 /// # use sbd::mo::Message;
30 /// # use sbd::storage::{Storage, MemoryStorage};
31 /// let message = Message::from_path("data/0-mo.sbd").unwrap();
32 /// let mut storage = MemoryStorage::new();
33 /// storage.store(message.clone());
34 /// let messages = storage.messages().unwrap();
35 /// assert_eq!(vec![message], messages);
36 /// ```
37 fn messages(&self) -> Result<Vec<Message>, Error>;
38
39 /// Retrieves all messages for a given IMEI.
40 ///
41 /// The default implementation just filters the vector provided by `messages`, but some
42 /// implementors could be more intelligent.
43 ///
44 /// # Examples
45 ///
46 /// ```
47 /// # use sbd::mo::Message;
48 /// # use sbd::storage::{Storage, MemoryStorage};
49 /// let message = Message::from_path("data/0-mo.sbd").unwrap();
50 /// let mut storage = MemoryStorage::new();
51 /// storage.store(message.clone());
52 /// let messages = storage.messages_from_imei("300234063904190").unwrap();
53 /// assert_eq!(vec![message], messages);
54 /// let messages = storage.messages_from_imei("300234063904191").unwrap();
55 /// assert!(messages.is_empty());
56 /// ```
57 fn messages_from_imei(&self, imei: &str) -> Result<Vec<Message>, Error> {
58 self.messages().map(|mut v| {
59 v.retain(|m| m.imei() == imei);
60 v
61 })
62 }
63}