mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-03-30 00:20:55 +03:00
Save config (#345)
* add setters for clients and authorized keys * impl change config request * basic saving functionality * save config automatically * add TODO comment
This commit is contained in:
committed by
GitHub
parent
a987f93133
commit
648b2b58a4
@@ -11,6 +11,7 @@ use std::path::{Path, PathBuf};
|
||||
use std::{collections::HashSet, io};
|
||||
use thiserror::Error;
|
||||
use toml;
|
||||
use toml_edit::{self, DocumentMut};
|
||||
|
||||
use lan_mouse_cli::CliArgs;
|
||||
use lan_mouse_ipc::{DEFAULT_PORT, Position};
|
||||
@@ -44,7 +45,7 @@ fn default_path() -> Result<PathBuf, VarError> {
|
||||
Ok(PathBuf::from(default_path))
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
|
||||
struct ConfigToml {
|
||||
capture_backend: Option<CaptureBackend>,
|
||||
emulation_backend: Option<EmulationBackend>,
|
||||
@@ -274,6 +275,33 @@ impl From<TomlClient> for ConfigClient {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<ConfigClient> for TomlClient {
|
||||
fn from(client: ConfigClient) -> Self {
|
||||
let hostname = client.hostname;
|
||||
let host_name = None;
|
||||
let mut ips = client.ips.into_iter().collect::<Vec<_>>();
|
||||
ips.sort();
|
||||
let ips = Some(ips);
|
||||
let port = if client.port == DEFAULT_PORT {
|
||||
None
|
||||
} else {
|
||||
Some(client.port)
|
||||
};
|
||||
let position = Some(client.pos);
|
||||
let activate_on_startup = if client.active { Some(true) } else { None };
|
||||
let enter_hook = client.enter_hook;
|
||||
Self {
|
||||
hostname,
|
||||
host_name,
|
||||
ips,
|
||||
port,
|
||||
position,
|
||||
activate_on_startup,
|
||||
enter_hook,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
pub enum ConfigError {
|
||||
#[error(transparent)]
|
||||
@@ -384,4 +412,57 @@ impl Config {
|
||||
.and_then(|c| c.release_bind.clone())
|
||||
.unwrap_or(Vec::from_iter(DEFAULT_RELEASE_KEYS.iter().cloned()))
|
||||
}
|
||||
|
||||
/// set configured clients
|
||||
pub fn set_clients(&mut self, clients: Vec<ConfigClient>) {
|
||||
if clients.is_empty() {
|
||||
return;
|
||||
}
|
||||
if self.config_toml.is_none() {
|
||||
self.config_toml = Default::default();
|
||||
}
|
||||
self.config_toml.as_mut().expect("config").clients =
|
||||
Some(clients.into_iter().map(|c| c.into()).collect::<Vec<_>>());
|
||||
}
|
||||
|
||||
/// set authorized keys
|
||||
pub fn set_authorized_keys(&mut self, fingerprints: HashMap<String, String>) {
|
||||
if fingerprints.is_empty() {
|
||||
return;
|
||||
}
|
||||
if self.config_toml.is_none() {
|
||||
self.config_toml = Default::default();
|
||||
}
|
||||
self.config_toml
|
||||
.as_mut()
|
||||
.expect("config")
|
||||
.authorized_fingerprints = Some(fingerprints);
|
||||
}
|
||||
|
||||
pub fn write_back(&self) -> Result<(), io::Error> {
|
||||
log::info!("writing config to {:?}", &self.config_path);
|
||||
/* load the current configuration file */
|
||||
let current_config = fs::read_to_string(&self.config_path)?;
|
||||
let current_config = current_config.parse::<DocumentMut>().expect("fix me");
|
||||
let _current_config =
|
||||
toml_edit::de::from_document::<ConfigToml>(current_config).expect("fixme");
|
||||
|
||||
/* the new config */
|
||||
let new_config = self.config_toml.clone().unwrap_or_default();
|
||||
// let new_config = toml_edit::ser::to_document::<ConfigToml>(&new_config).expect("fixme");
|
||||
let new_config = toml_edit::ser::to_string_pretty(&new_config).expect("config");
|
||||
|
||||
/*
|
||||
* TODO merge documents => eventually we might want to split this up into clients configured
|
||||
* via the config file and clients managed through the GUI / frontend.
|
||||
* The latter should be saved to $XDG_DATA_HOME instead of $XDG_CONFIG_HOME,
|
||||
* and clients configured through .config could be made permanent.
|
||||
* For now we just override the config file.
|
||||
*/
|
||||
|
||||
/* write new config to file */
|
||||
fs::write(&self.config_path, new_config)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user