ferro_rs/database/
config.rs1use crate::config::{env, env_optional};
4
5#[derive(Debug, Clone, PartialEq)]
7pub enum DatabaseType {
8 Postgres,
10 Sqlite,
12 Unknown,
14}
15
16#[derive(Debug, Clone)]
41pub struct DatabaseConfig {
42 pub url: String,
44 pub max_connections: u32,
46 pub min_connections: u32,
48 pub connect_timeout: u64,
50 pub logging: bool,
52}
53
54impl DatabaseConfig {
55 pub fn from_env() -> Self {
57 Self {
58 url: env_optional("DATABASE_URL")
59 .unwrap_or_else(|| "sqlite://./database.db".to_string()),
60 max_connections: env("DB_MAX_CONNECTIONS", 10),
61 min_connections: env("DB_MIN_CONNECTIONS", 1),
62 connect_timeout: env("DB_CONNECT_TIMEOUT", 30),
63 logging: env("DB_LOGGING", false),
64 }
65 }
66
67 pub fn builder() -> DatabaseConfigBuilder {
69 DatabaseConfigBuilder::default()
70 }
71
72 pub fn database_type(&self) -> DatabaseType {
74 if self.url.starts_with("postgres://") || self.url.starts_with("postgresql://") {
75 DatabaseType::Postgres
76 } else if self.url.starts_with("sqlite://") || self.url.starts_with("sqlite:") {
77 DatabaseType::Sqlite
78 } else {
79 DatabaseType::Unknown
80 }
81 }
82
83 pub fn is_configured(&self) -> bool {
85 self.url != "sqlite://./database.db"
86 }
87}
88
89impl Default for DatabaseConfig {
90 fn default() -> Self {
91 Self::from_env()
92 }
93}
94
95#[derive(Debug, Default)]
97pub struct DatabaseConfigBuilder {
98 url: Option<String>,
99 max_connections: Option<u32>,
100 min_connections: Option<u32>,
101 connect_timeout: Option<u64>,
102 logging: Option<bool>,
103}
104
105impl DatabaseConfigBuilder {
106 pub fn url(mut self, url: impl Into<String>) -> Self {
108 self.url = Some(url.into());
109 self
110 }
111
112 pub fn max_connections(mut self, count: u32) -> Self {
114 self.max_connections = Some(count);
115 self
116 }
117
118 pub fn min_connections(mut self, count: u32) -> Self {
120 self.min_connections = Some(count);
121 self
122 }
123
124 pub fn connect_timeout(mut self, seconds: u64) -> Self {
126 self.connect_timeout = Some(seconds);
127 self
128 }
129
130 pub fn logging(mut self, enabled: bool) -> Self {
132 self.logging = Some(enabled);
133 self
134 }
135
136 pub fn build(self) -> DatabaseConfig {
138 let defaults = DatabaseConfig::from_env();
139 DatabaseConfig {
140 url: self.url.unwrap_or(defaults.url),
141 max_connections: self.max_connections.unwrap_or(defaults.max_connections),
142 min_connections: self.min_connections.unwrap_or(defaults.min_connections),
143 connect_timeout: self.connect_timeout.unwrap_or(defaults.connect_timeout),
144 logging: self.logging.unwrap_or(defaults.logging),
145 }
146 }
147}