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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
//! //! `redis-ac` is a helper crate for [redis][], which provides asynchronous version of [`redis::Commands`][]. //! //! [`Commands`][] trait of this crate is automatically implemented for any types //! which implement [`redis::aio::ConnectionLike`][]. //! //! Non-scan command methods of [`Commands`][] return a future. //! //! ```rust,no_run //! use futures::prelude::*; //! use redis_ac::Commands; //! //! # fn main() { //! let client = redis::Client::open("redis://127.0.0.1").unwrap(); //! let connect = client.get_async_connection(); //! //! let f = connect.and_then(|con|{ //! con.set("key", "value") //! .and_then(|(con, res): (_, String)| { //! assert_eq!(res, "OK"); //! con.get("key") //! }) //! .and_then(|(_, res): (_, String)| { //! assert_eq!(res, "value"); //! Ok(()) //! }) //! }).map_err(|e| eprintln!("{}", e)); //! //! tokio::run(f); //! # } //! ``` //! //! Scan command methods of [`Commands`][] return a stream over scanned items. //! //! The stream returns tuples of an optional connection object and an optional item. //! When the last item is returned, the optional value becomes `Some` //! which holds the connection object passed to the method. Until then, it is `None`. //! The item is normally `Some`. It is set to `None` only if no items are found by scan. //! In such case, the stream just returns `(Some, None)` and finishes. //! //! ```rust,no_run //! use futures::prelude::*; //! use redis_ac::Commands; //! //! # fn main() { //! let client = redis::Client::open("redis://127.0.0.1").unwrap(); //! let connect = client.get_async_connection(); //! //! let f = connect.and_then(|con|{ //! con.scan_match("key*") //! .for_each(|(con, item): (_, Option<String>)| { //! println!("{:?}", item); //! if con.is_some() { //! // The last item comes with the connection object. //! if item.is_none() { //! // If no items found by scan, `(Some(con), None)` is given. //! println!("No item"); //! } //! } //! Ok(()) //! }) //! }).map_err(|e| eprintln!("{}", e)); //! //! tokio::run(f); //! # } //! ``` //! //! If you are interested in only items, `filter_map` can be used to simplify. //! //! ```rust,no_run //! use futures::prelude::*; //! use redis_ac::Commands; //! //! # fn main() { //! let client = redis::Client::open("redis://127.0.0.1").unwrap(); //! let connect = client.get_async_connection(); //! //! let f = connect.and_then(|con|{ //! con.scan_match("key*") //! .filter_map(|(_, item)| item) //! .for_each(|item: String| { //! // Here we get only items. //! Ok(()) //! }) //! }).map_err(|e| eprintln!("{}", e)); //! //! tokio::run(f); //! # } //! ``` #![cfg_attr(feature = "readme", feature(external_doc))] #![warn(missing_docs)] mod commands; mod stream; #[cfg_attr(feature = "readme", doc(include = "../README.md"))] type _Doctest = (); pub use crate::commands::{Commands, RedisScanAll, RedisScanStream};