env_url/
lib.rs

1//!
2//! This crate provides env-composable service urls complete with key overrides as to facilitate flexibility and to simplify integration with kubernetes.
3//!
4//! ## Env mapping behaviors
5//!
6//! | ENV                     |                                                           |
7//! | -----------------------:|:---------------------------------------------------------:|
8//! | {PREFIX}_URL            | set service url, disregarding other overrides             |
9//! | {PREFIX}_URL_ENV        | override `{PREFIX}_URL` env mapping                       |
10//! | {PREFIX}_SCHEME         | set url scheme component                                  |
11//! | {PREFIX}_SCHEME_ENV     | override `{PREFIX}_SCHEME` env mapping                    |
12//! | {PREFIX}_PATH           | set url path component                                    |
13//! | {PREFIX}_PATH_ENV       | override `{PREFIX}_PATH` env mapping                      |
14//! | {PREFIX}_QUERY          | set url query component                                   |
15//! | {PREFIX}_QUERY_ENV      | override `{PREFIX}_QUERY` env mapping                     |
16//! | {PREFIX}_USERINFO       | set url userinfo component                                |
17//! | {PREFIX}_USERINFO_ENV   | override `{PREFIX}_USERINFO` env mapping                  |
18//!
19//! ## Example
20//!
21//! ```
22//! use env_url::*;
23//!
24//! #[derive(EnvURL)]
25//! #[env_url(env_prefix = "REDIS", default = "redis://127.0.0.1:6379")]
26//! pub struct RedisDB;
27//!
28//! let service_url = RedisDB::service_url();
29//!
30//! ```
31//!
32#[doc(hidden)]
33pub extern crate url;
34
35extern crate self as env_url;
36
37pub use derive_env_url::*;
38pub use url::{ParseError, Url};
39pub trait ServiceURL {
40  fn service_url() -> Result<Url, ParseError>;
41}
42
43#[cfg(test)]
44#[ctor::ctor]
45fn setup_test_env() {
46  std::env::remove_var("REDIS_URL");
47  std::env::remove_var("REDIS_URL_ENV");
48  std::env::remove_var("REDIS_SCHEME");
49  std::env::remove_var("REDIS_SCHEME_ENV");
50  std::env::remove_var("REDIS_PATH");
51  std::env::remove_var("REDIS_PATH_ENV");
52  std::env::remove_var("REDIS_QUERY");
53  std::env::remove_var("REDIS_QUERY_ENV");
54  std::env::remove_var("REDIS_USERINFO");
55  std::env::remove_var("REDIS_USERINFO_ENV");
56}
57#[cfg(test)]
58mod tests {
59  use env_url::*;
60
61  #[derive(EnvURL)]
62  #[env_url(env_prefix = "REDIS", default = "redis://127.0.0.1:6379")]
63  struct RedisDB;
64
65  #[test]
66  fn it_creates_url() -> Result<(), ParseError> {
67    let url = RedisDB::service_url()?;
68
69    assert_eq!(url.as_str(), "redis://127.0.0.1:6379");
70
71    Ok(())
72  }
73}