pub trait Storage {
    fn get(&self, key: &str) -> Result<Option<Vec<u8>>, StorageError>;
    fn put(&mut self, key: &str, value: Vec<u8>, ttl: Duration) -> Result<(), StorageError>;
    fn delete(&mut self, key: &str) -> Result<bool, StorageError>;
    fn flush(&mut self) -> Result<(), StorageError>;
    fn keys(&self) -> Box<dyn Iterator<Item = String> + '_>;
}