pub mod constants;
#[cfg(feature = "models")]
pub mod models;
pub mod secrets;
#[cfg(feature = "tables")]
pub mod tables;
pub mod templates;
use serde::{Deserialize, Serialize};
#[derive(Clone, Deserialize, Serialize, Default)]
pub struct DbInput {
pub local_uri: Option<String>,
pub db_name: Option<String>,
}
#[derive(Deserialize, Serialize)]
#[serde(untagged)]
pub enum DatabaseResource {
ConnectionString(String),
Info(DatabaseInfo),
}
#[derive(Clone, Serialize, Deserialize)]
#[typeshare::typeshare]
pub struct DatabaseInfo {
engine: String,
role_name: String,
role_password: String,
database_name: String,
port: String,
hostname: String,
instance_name: Option<String>,
}
impl DatabaseInfo {
pub fn new(
engine: String,
role_name: String,
role_password: String,
database_name: String,
port: String,
hostname: String,
instance_name: Option<String>,
) -> Self {
Self {
engine,
role_name,
role_password,
database_name,
port,
hostname,
instance_name,
}
}
pub fn connection_string(&self, show_password: bool) -> String {
format!(
"{}://{}:{}@{}:{}/{}",
self.engine,
self.role_name,
if show_password {
&self.role_password
} else {
"********"
},
self.hostname,
self.port,
self.database_name,
)
}
pub fn role_name(&self) -> String {
self.role_name.to_string()
}
pub fn database_name(&self) -> String {
self.database_name.to_string()
}
pub fn instance_name(&self) -> Option<String> {
self.instance_name.clone()
}
}
impl std::fmt::Debug for DatabaseInfo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "DatabaseInfo {{ {:?} }}", self.connection_string(false))
}
}
#[derive(Serialize, Deserialize)]
pub struct ContainerRequest {
pub project_name: String,
pub container_name: String,
pub image: String,
pub port: String,
pub env: Vec<String>,
}
#[derive(Serialize, Deserialize)]
pub struct ContainerResponse {
pub host_port: String,
}
pub fn semvers_are_compatible(a: &semver::Version, b: &semver::Version) -> bool {
if a.major != 0 || b.major != 0 {
a.major == b.major
} else if a.minor != 0 || b.minor != 0 {
a.minor == b.minor
} else {
a.patch == b.patch
}
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
#[test]
fn semver_compatibility_check_works() {
let semver_tests = &[
("1.0.0", "1.0.0", true),
("1.8.0", "1.0.0", true),
("0.1.0", "0.2.1", false),
("0.9.0", "0.2.0", false),
];
for (version_a, version_b, are_compatible) in semver_tests {
let version_a = semver::Version::from_str(version_a).unwrap();
let version_b = semver::Version::from_str(version_b).unwrap();
assert_eq!(
super::semvers_are_compatible(&version_a, &version_b),
*are_compatible
);
}
}
}