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}