2019-10-09 02:35:26 +02:00
|
|
|
use super::redis_cfg_types::*;
|
2020-04-22 20:38:22 +02:00
|
|
|
use super::{EnvVar, Error};
|
2020-04-15 02:37:49 +02:00
|
|
|
|
2020-01-06 03:58:18 +01:00
|
|
|
use url::Url;
|
2019-10-03 06:34:41 +02:00
|
|
|
|
2020-04-22 20:38:22 +02:00
|
|
|
type Result<T> = std::result::Result<T, Error>;
|
2020-04-15 02:37:49 +02:00
|
|
|
|
2019-10-09 02:35:26 +02:00
|
|
|
#[derive(Debug, Default)]
|
2020-04-13 22:03:06 +02:00
|
|
|
pub struct Redis {
|
2020-04-21 22:39:31 +02:00
|
|
|
pub(crate) user: RedisUser,
|
|
|
|
pub(crate) password: RedisPass,
|
|
|
|
pub(crate) port: RedisPort,
|
|
|
|
pub(crate) host: RedisHost,
|
|
|
|
pub(crate) db: RedisDb,
|
|
|
|
pub(crate) namespace: RedisNamespace,
|
2019-10-09 02:35:26 +02:00
|
|
|
// **NOTE**: Polling Redis is much more time consuming than polling the `Receiver` (~1ms
|
|
|
|
// compared to ~50μs). Thus, changing this setting with REDIS_POLL_INTERVAL may be a good
|
|
|
|
// place to start for performance improvements at the cost of delaying all updates.
|
|
|
|
pub polling_interval: RedisInterval,
|
2019-10-03 06:34:41 +02:00
|
|
|
}
|
2019-10-09 02:35:26 +02:00
|
|
|
|
2020-01-06 03:58:18 +01:00
|
|
|
impl EnvVar {
|
2020-04-15 02:37:49 +02:00
|
|
|
fn update_with_redis_url(mut self, url_str: &str) -> Result<Self> {
|
|
|
|
let url = Url::parse(url_str)?;
|
2020-01-06 03:58:18 +01:00
|
|
|
let none_if_empty = |s: String| if s.is_empty() { None } else { Some(s) };
|
|
|
|
|
|
|
|
self.maybe_add_env_var("REDIS_PORT", url.port());
|
|
|
|
self.maybe_add_env_var("REDIS_PASSWORD", url.password());
|
|
|
|
self.maybe_add_env_var("REDIS_USERNAME", none_if_empty(url.username().to_string()));
|
|
|
|
self.maybe_add_env_var("REDIS_DB", none_if_empty(url.path()[1..].to_string()));
|
|
|
|
for (k, v) in url.query_pairs().into_owned() {
|
|
|
|
match k.to_string().as_str() {
|
|
|
|
"password" => self.maybe_add_env_var("REDIS_PASSWORD", Some(v.to_string())),
|
|
|
|
"db" => self.maybe_add_env_var("REDIS_DB", Some(v.to_string())),
|
2020-04-22 20:38:22 +02:00
|
|
|
_ => Err(Error::config(
|
2020-04-15 02:37:49 +02:00
|
|
|
"REDIS_URL",
|
|
|
|
&k,
|
|
|
|
"a URL with parameters `password`, `db`, only",
|
|
|
|
))?,
|
2020-01-06 03:58:18 +01:00
|
|
|
}
|
|
|
|
}
|
2020-04-15 02:37:49 +02:00
|
|
|
Ok(self)
|
2020-01-06 03:58:18 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-13 22:03:06 +02:00
|
|
|
impl Redis {
|
2019-10-09 02:35:26 +02:00
|
|
|
const USER_SET_WARNING: &'static str =
|
|
|
|
"Redis user specified, but Redis did not ask for a username. Ignoring it.";
|
2020-03-20 01:54:23 +01:00
|
|
|
const DB_SET_WARNING: &'static str = r"Redis database specified, but PubSub connections do not use databases.
|
2019-10-09 02:35:26 +02:00
|
|
|
For similar functionality, you may wish to set a REDIS_NAMESPACE";
|
2019-10-04 00:02:23 +02:00
|
|
|
|
2020-04-21 22:39:31 +02:00
|
|
|
pub(crate) fn from_env(env: EnvVar) -> Result<Self> {
|
2019-10-09 20:46:56 +02:00
|
|
|
let env = match env.get("REDIS_URL").cloned() {
|
2020-04-15 02:37:49 +02:00
|
|
|
Some(url_str) => env.update_with_redis_url(&url_str)?,
|
2019-10-09 02:35:26 +02:00
|
|
|
None => env,
|
|
|
|
};
|
2019-10-04 00:02:23 +02:00
|
|
|
|
2020-04-13 22:03:06 +02:00
|
|
|
let cfg = Redis {
|
2020-04-15 02:37:49 +02:00
|
|
|
user: RedisUser::default().maybe_update(env.get("REDIS_USER"))?,
|
|
|
|
password: RedisPass::default().maybe_update(env.get("REDIS_PASSWORD"))?,
|
|
|
|
port: RedisPort::default().maybe_update(env.get("REDIS_PORT"))?,
|
|
|
|
host: RedisHost::default().maybe_update(env.get("REDIS_HOST"))?,
|
|
|
|
db: RedisDb::default().maybe_update(env.get("REDIS_DB"))?,
|
|
|
|
namespace: RedisNamespace::default().maybe_update(env.get("REDIS_NAMESPACE"))?,
|
|
|
|
polling_interval: RedisInterval::default().maybe_update(env.get("REDIS_FREQ"))?,
|
2019-10-09 02:35:26 +02:00
|
|
|
};
|
2019-10-04 00:02:23 +02:00
|
|
|
|
2019-10-09 02:35:26 +02:00
|
|
|
if cfg.db.is_some() {
|
|
|
|
log::warn!("{}", Self::DB_SET_WARNING);
|
|
|
|
}
|
|
|
|
if cfg.user.is_some() {
|
|
|
|
log::warn!("{}", Self::USER_SET_WARNING);
|
|
|
|
}
|
2020-04-15 02:37:49 +02:00
|
|
|
Ok(cfg)
|
2019-10-04 00:02:23 +02:00
|
|
|
}
|
2019-10-03 06:34:41 +02:00
|
|
|
}
|