use std::marker::PhantomData;
use dynamic_config::dynamic_config;
use serde::Deserialize;
trait Driver {
const SCHEME: &'static str;
}
struct Postgres;
struct Mysql;
impl Driver for Postgres {
const SCHEME: &'static str = "postgres";
}
impl Driver for Mysql {
const SCHEME: &'static str = "mysql";
}
#[dynamic_config]
#[derive(Debug, Deserialize)]
struct Db<D: Driver> {
host: String,
port: u16,
#[serde(skip)]
driver: PhantomData<fn() -> D>,
}
impl<D: Driver> Db<D> {
fn url(&self) -> String {
format!("{}://{}:{}", D::SCHEME, self.host, self.port)
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let postgres = Db::<Postgres>::builder("db").file("dynamic-config/examples/databases.json");
let mysql = Db::<Mysql>::builder("db").file("dynamic-config/examples/databases.json");
postgres.init()?;
mysql.init()?;
println!("postgres: {}", Db::<Postgres>::current().url());
println!("mysql: {}", Db::<Mysql>::current().url());
Db::<Mysql>::set_override("port", 3306u16)?;
println!("\nafter overriding only the mysql port:");
println!(" postgres: {}", postgres.load()?.url());
println!(" mysql: {}", mysql.load()?.url());
Db::<Mysql>::clear_overrides();
println!("\nA lifetime parameter would be rejected at compile time: the");
println!("snapshot outlives every borrow that could name one.");
Ok(())
}