summaryrefslogtreecommitdiffstats
path: root/src/config.rs
diff options
context:
space:
mode:
authorTomasz Kramkowski <tomasz@kramkow.ski>2025-05-03 20:00:17 +0100
committerTomasz Kramkowski <tomasz@kramkow.ski>2025-05-03 20:00:17 +0100
commit6b2711c5703c2b724066c88967c1924f1f1dbedf (patch)
tree4561b0fb47a3429b86e82b19f335b6aed1081e5f /src/config.rs
downloadz2m-utils-6b2711c5703c2b724066c88967c1924f1f1dbedf.tar.gz
z2m-utils-6b2711c5703c2b724066c88967c1924f1f1dbedf.tar.xz
z2m-utils-6b2711c5703c2b724066c88967c1924f1f1dbedf.zip
basic z2m-utilsHEADmaster
Diffstat (limited to 'src/config.rs')
-rw-r--r--src/config.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/config.rs b/src/config.rs
new file mode 100644
index 0000000..e8a4287
--- /dev/null
+++ b/src/config.rs
@@ -0,0 +1,64 @@
+use std::{fs::File, io::Read, process, time::Duration};
+
+use rumqttc::{Client, Connection, MqttOptions};
+use serde::Deserialize;
+
+use crate::PROGRAM;
+
+#[derive(Deserialize)]
+pub struct Credentials {
+ pub username: String,
+ pub password: String,
+}
+
+fn default_host() -> String {
+ "localhost".to_string()
+}
+
+fn default_port() -> u16 {
+ 1883
+}
+
+fn default_id_prefix() -> String {
+ PROGRAM.to_string()
+}
+
+#[derive(Deserialize)]
+pub struct Config {
+ #[serde(default = "default_host")]
+ pub host: String,
+ #[serde(default = "default_port")]
+ pub port: u16,
+ #[serde(default = "default_id_prefix")]
+ pub id_prefix: String,
+ pub credentials: Option<Credentials>,
+}
+
+impl Config {
+ pub fn mqtt_client(&self) -> (Client, Connection) {
+ let client_id = format!("{}_{}", self.id_prefix, process::id());
+ let mut options = MqttOptions::new(client_id, &self.host, self.port);
+ if let Some(credentials) = &self.credentials {
+ options.set_credentials(&credentials.username, &credentials.password);
+ }
+ options.set_keep_alive(Duration::from_secs(5));
+ Client::new(options, 10)
+ }
+}
+
+pub fn get() -> Config {
+ let config = if let Ok(dirs) = xdg::BaseDirectories::with_prefix(PROGRAM) {
+ if let Some(config_file) = dirs.find_config_file("config.toml") {
+ let mut config_file = File::open(config_file).unwrap();
+ let mut config = String::new();
+ config_file.read_to_string(&mut config).unwrap();
+ Some(config)
+ } else {
+ None
+ }
+ } else {
+ None
+ };
+ let config = config.unwrap_or_default();
+ toml::from_str(&config).unwrap()
+}