use rainier_cache::CacheDriver;
use rainier_config::{config_keys, AppEnv};
use rainier_crypt::CryptScheme;
use rainier_mail::MailDriver;
use rainier_queue::QueueDriver;
use rainier_session::SessionDriver;
use rainier_telemetry::LogFormat;
config_keys! {
pub APP_NAME: String = "app.name";
pub APP_ENV: AppEnv = "app.env";
pub APP_DEBUG: bool = "app.debug";
pub APP_URL: String = "app.url";
pub APP_BASE_PATH: String = "app.base_path";
pub SERVER_HOST: String = "server.host";
pub SERVER_PORT: u16 = "server.port";
pub SERVER_MAX_BODY_BYTES: u64 = "server.max_body_bytes";
pub SERVER_REQUEST_TIMEOUT_SECS: u64 = "server.request_timeout_secs";
pub SERVER_COMPRESSION: bool = "server.compression";
pub METRICS_ENABLED: bool = "metrics.enabled";
pub METRICS_PATH: String = "metrics.path";
pub OPENAPI_ENABLED: bool = "openapi.enabled";
pub OPENAPI_PATH: String = "openapi.path";
pub OPENAPI_TITLE: String = "openapi.title";
pub OPENAPI_VERSION: String = "openapi.version";
pub OPENAPI_SERVER: String = "openapi.server";
pub TELEMETRY_ENABLED: bool = "telemetry.enabled";
pub TELEMETRY_ENDPOINT: String = "telemetry.endpoint";
pub TELEMETRY_SERVICE_NAME: String = "telemetry.service_name";
pub TELEMETRY_SAMPLE_RATIO: f64 = "telemetry.sample_ratio";
pub APP_CIPHER: CryptScheme = "app.cipher";
pub LOG_FORMAT: LogFormat = "telemetry.log_format";
pub DATABASE_URL: String = "database.url";
pub CACHE_DRIVER: CacheDriver = "cache.driver";
pub CACHE_REDIS_URL: String = "cache.redis_url";
pub CACHE_MEMCACHED_URL: String = "cache.memcached_url";
pub CACHE_PREFIX: String = "cache.prefix";
pub SESSION_DRIVER: SessionDriver = "session.driver";
pub SESSION_LIFETIME: i64 = "session.lifetime";
pub SESSION_COOKIE: String = "session.cookie";
pub SESSION_SECURE: bool = "session.secure";
pub QUEUE_DRIVER: QueueDriver = "queue.driver";
pub QUEUE_DEFAULT: String = "queue.default";
pub MAIL_DRIVER: MailDriver = "mail.driver";
pub MAIL_FROM_ADDRESS: String = "mail.from.address";
pub MAIL_FROM_NAME: String = "mail.from.name";
}
#[cfg(test)]
mod tests {
use super::*;
use rainier_config::Config;
#[test]
fn a_driver_key_round_trips_as_its_wire_spelling() {
let config = Config::new();
config.set(CACHE_DRIVER, CacheDriver::RedisCluster).unwrap();
assert_eq!(config.string("cache.driver").as_deref(), Some("redis-cluster"));
assert_eq!(config.setting(CACHE_DRIVER).unwrap(), CacheDriver::RedisCluster);
}
#[test]
fn every_key_is_under_the_section_its_name_says() {
let pairs: &[(&str, &str)] = &[
("APP", APP_NAME.path()),
("APP", APP_ENV.path()),
("APP", APP_DEBUG.path()),
("APP", APP_URL.path()),
("APP", APP_BASE_PATH.path()),
("SERVER", SERVER_HOST.path()),
("SERVER", SERVER_PORT.path()),
("SERVER", SERVER_MAX_BODY_BYTES.path()),
("SERVER", SERVER_REQUEST_TIMEOUT_SECS.path()),
("SERVER", SERVER_COMPRESSION.path()),
("DATABASE", DATABASE_URL.path()),
("CACHE", CACHE_DRIVER.path()),
("CACHE", CACHE_REDIS_URL.path()),
("CACHE", CACHE_MEMCACHED_URL.path()),
("CACHE", CACHE_PREFIX.path()),
("SESSION", SESSION_DRIVER.path()),
("SESSION", SESSION_LIFETIME.path()),
("SESSION", SESSION_COOKIE.path()),
("SESSION", SESSION_SECURE.path()),
("QUEUE", QUEUE_DRIVER.path()),
("QUEUE", QUEUE_DEFAULT.path()),
("MAIL", MAIL_DRIVER.path()),
("MAIL", MAIL_FROM_ADDRESS.path()),
("MAIL", MAIL_FROM_NAME.path()),
];
for (section, path) in pairs {
assert!(
path.starts_with(&format!("{}.", section.to_lowercase())),
"`{path}` is filed under the wrong section"
);
}
}
#[test]
fn no_two_keys_name_the_same_path() {
let paths = [
APP_NAME.path(),
APP_ENV.path(),
APP_DEBUG.path(),
APP_URL.path(),
APP_BASE_PATH.path(),
SERVER_HOST.path(),
SERVER_PORT.path(),
SERVER_MAX_BODY_BYTES.path(),
SERVER_REQUEST_TIMEOUT_SECS.path(),
SERVER_COMPRESSION.path(),
DATABASE_URL.path(),
CACHE_DRIVER.path(),
CACHE_REDIS_URL.path(),
CACHE_MEMCACHED_URL.path(),
CACHE_PREFIX.path(),
SESSION_DRIVER.path(),
SESSION_LIFETIME.path(),
SESSION_COOKIE.path(),
SESSION_SECURE.path(),
QUEUE_DRIVER.path(),
QUEUE_DEFAULT.path(),
MAIL_DRIVER.path(),
MAIL_FROM_ADDRESS.path(),
MAIL_FROM_NAME.path(),
];
let unique: std::collections::BTreeSet<_> = paths.iter().collect();
assert_eq!(unique.len(), paths.len(), "two keys share a path: {paths:?}");
}
}