use std::path::{Path, PathBuf};
use std::str::FromStr;
#[derive(Default, Debug, Clone, Copy)]
pub enum MySqlSslMode {
Disabled,
#[default]
Preferred,
Required,
VerifyCa,
VerifyIdentity,
}
impl std::fmt::Display for MySqlSslMode {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
MySqlSslMode::Disabled => write!(f, "disabled"),
MySqlSslMode::Preferred => write!(f, "preferred"),
MySqlSslMode::Required => write!(f, "required"),
MySqlSslMode::VerifyCa => write!(f, "verify_ca"),
MySqlSslMode::VerifyIdentity => write!(f, "verify_identity"),
}
}
}
impl FromStr for MySqlSslMode {
type Err = String;
fn from_str(s: &str) -> Result<Self, String> {
Ok(match &*s.to_ascii_lowercase() {
"disabled" => MySqlSslMode::Disabled,
"preferred" => MySqlSslMode::Preferred,
"required" => MySqlSslMode::Required,
"verify_ca" => MySqlSslMode::VerifyCa,
"verify_identity" => MySqlSslMode::VerifyIdentity,
_ => {
return Err(format!("unknown value {s:?} for `ssl_mode`"));
}
})
}
}
#[derive(Debug, Clone)]
pub struct MySqlConnectOptions {
pub(crate) host: String,
pub(crate) port: u16,
pub(crate) socket: Option<PathBuf>,
pub(crate) username: String,
pub(crate) password: Option<String>,
pub(crate) database: Option<String>,
pub(crate) ssl_mode: MySqlSslMode,
pub(crate) ssl_ca: Option<PathBuf>,
pub(crate) ssl_client_cert: Option<PathBuf>,
pub(crate) ssl_client_key: Option<PathBuf>,
}
impl Default for MySqlConnectOptions {
fn default() -> Self {
Self::new()
}
}
impl MySqlConnectOptions {
pub fn new() -> Self {
Self {
port: 3306,
host: String::from("localhost"),
socket: None,
username: String::from("root"),
password: None,
database: None,
ssl_mode: MySqlSslMode::Preferred,
ssl_ca: None,
ssl_client_cert: None,
ssl_client_key: None,
}
}
pub fn host(mut self, host: &str) -> Self {
self.host = host.to_owned();
self
}
pub fn port(mut self, port: u16) -> Self {
self.port = port;
self
}
pub fn socket(mut self, path: impl AsRef<Path>) -> Self {
self.socket = Some(path.as_ref().to_path_buf());
self
}
pub fn username(mut self, username: &str) -> Self {
self.username = username.to_owned();
self
}
pub fn password(mut self, password: &str) -> Self {
self.password = Some(password.to_owned());
self
}
pub fn database(mut self, database: &str) -> Self {
self.database = Some(database.to_owned());
self
}
pub fn ssl_mode(mut self, mode: MySqlSslMode) -> Self {
self.ssl_mode = mode;
self
}
pub fn ssl_ca(mut self, file_name: impl AsRef<Path>) -> Self {
self.ssl_ca = Some(file_name.as_ref().to_owned());
self
}
pub fn ssl_client_cert(mut self, cert: impl AsRef<Path>) -> Self {
self.ssl_client_cert = Some(cert.as_ref().to_path_buf());
self
}
pub fn ssl_client_key(mut self, key: impl AsRef<Path>) -> Self {
self.ssl_client_key = Some(key.as_ref().to_path_buf());
self
}
}