1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//! Squirrel away SBD messages and retrieve them later.

mod filesystem;
mod memory;

pub use self::filesystem::Storage as FilesystemStorage;
pub use self::memory::Storage as MemoryStorage;

use Result;
use mo::Message;

/// Basic storage operations.
pub trait Storage {
    /// Stores a message, consuming it.
    ///
    /// # Examples
    ///
    /// ```
    /// # use sbd::mo::Message;
    /// # use sbd::storage::{Storage, MemoryStorage};
    /// let message = Message::from_path("data/0-mo.sbd").unwrap();
    /// let mut storage = MemoryStorage::new();
    /// storage.store(message);
    /// ```
    fn store(&mut self, message: Message) -> Result<()>;

    /// Retrieves all messages in this storage as a vector.
    ///
    /// # Examples
    ///
    /// ```
    /// # use sbd::mo::Message;
    /// # use sbd::storage::{Storage, MemoryStorage};
    /// let message = Message::from_path("data/0-mo.sbd").unwrap();
    /// let mut storage = MemoryStorage::new();
    /// storage.store(message.clone());
    /// let messages = storage.messages().unwrap();
    /// assert_eq!(vec![message], messages);
    /// ```
    fn messages(&self) -> Result<Vec<Message>>;

    /// Retrieves all messages for a given IMEI.
    ///
    /// The default implementation just filters the vector provided by `messages`, but some
    /// implementors could be more intelligent.
    ///
    /// # Examples
    ///
    /// ```
    /// # use sbd::mo::Message;
    /// # use sbd::storage::{Storage, MemoryStorage};
    /// let message = Message::from_path("data/0-mo.sbd").unwrap();
    /// let mut storage = MemoryStorage::new();
    /// storage.store(message.clone());
    /// let messages = storage.messages_from_imei("300234063904190").unwrap();
    /// assert_eq!(vec![message], messages);
    /// let messages = storage.messages_from_imei("300234063904191").unwrap();
    /// assert!(messages.is_empty());
    /// ```
    fn messages_from_imei(&self, imei: &str) -> Result<Vec<Message>> {
        self.messages().map(|mut v| {
            v.retain(|m| m.imei() == imei);
            v
        })
    }
}