Skip to content

Instantly share code, notes, and snippets.

@rightfold
Created October 1, 2016 14:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rightfold/610d2c111570e4c230dc25033b1090da to your computer and use it in GitHub Desktop.
Save rightfold/610d2c111570e4c230dc25033b1090da to your computer and use it in GitHub Desktop.
use redis::{Redis, Reply, ReplyBox, ReplyRef};
use std::io;
pub fn tape_addresses(redis: &mut Redis, tape_id: &str) -> io::Result<ServerSet> {
let reply = try!(redis.command(&[
b"EVAL",
include_bytes!("funnel/tape_addresses.lua"),
b"0",
tape_id.as_bytes(),
]));
Ok(ServerSet(reply))
}
pub struct ServerSet(ReplyBox);
impl ServerSet {
pub fn iter<'a>(&'a self) -> ServerSetIter<'a> {
match self.0.deref() {
Reply::Array(servers) => ServerSetIter{servers: servers, offset: 0},
_ => ServerSetIter{servers: &[], offset: 0},
}
}
}
// TODO: Delete this once #34511 is stable.
pub struct ServerSetIter<'a> {
servers: &'a [ReplyRef],
offset: usize,
}
impl<'a> Iterator for ServerSetIter<'a> {
type Item = &'a [u8];
fn next(&mut self) -> Option<&'a [u8]> {
self.servers.get(self.offset)
.and_then(|server| match server.deref() {
Reply::String(name) => {
self.offset += 1;
Some(name)
},
_ => None,
})
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment