Add git hooks via cargo-husky. Many many cleanups.

This commit is contained in:
Luke D. Jones
2023-01-16 12:03:52 +13:00
parent b5b7799018
commit a83ccbd33d
49 changed files with 252 additions and 250 deletions

12
.cargo-husky/hooks/pre-commit Executable file
View File

@@ -0,0 +1,12 @@
#!/bin/sh
set -e
echo '+cargo +nightly fmt --all -- --check'
cargo +nightly fmt --all -- --check
echo '+cargo clippy --all -- -D warnings'
cargo clippy --all -- -D warnings
echo '+cargo test --all'
cargo test --all
echo '+cargo cranky'
cargo cranky

10
.cargo-husky/hooks/pre-push Executable file
View File

@@ -0,0 +1,10 @@
#!/bin/sh
set -e
echo '+cargo +nightly fmt --all -- --check'
cargo +nightly fmt --all -- --check
echo '+cargo clippy --all -- -D warnings'
cargo clippy --all -- -D warnings
echo '+cargo cranky'
cargo cranky

18
Cargo.lock generated
View File

@@ -151,6 +151,7 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
name = "asusctl" name = "asusctl"
version = "4.6.0-rc1" version = "4.6.0-rc1"
dependencies = [ dependencies = [
"cargo-husky",
"daemon", "daemon",
"gif", "gif",
"glam", "glam",
@@ -504,6 +505,12 @@ dependencies = [
"vec_map", "vec_map",
] ]
[[package]]
name = "cargo-husky"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.78" version = "1.0.78"
@@ -659,8 +666,9 @@ dependencies = [
[[package]] [[package]]
name = "config-traits" name = "config-traits"
version = "0.1.0" version = "4.6.0-rc1"
dependencies = [ dependencies = [
"cargo-husky",
"log", "log",
"ron", "ron",
"serde", "serde",
@@ -793,6 +801,7 @@ name = "daemon"
version = "4.6.0-rc1" version = "4.6.0-rc1"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"cargo-husky",
"concat-idents", "concat-idents",
"config-traits", "config-traits",
"env_logger", "env_logger",
@@ -815,6 +824,7 @@ dependencies = [
name = "daemon-user" name = "daemon-user"
version = "4.6.0-rc1" version = "4.6.0-rc1"
dependencies = [ dependencies = [
"cargo-husky",
"config-traits", "config-traits",
"dirs", "dirs",
"env_logger", "env_logger",
@@ -2709,6 +2719,7 @@ dependencies = [
name = "rog-control-center" name = "rog-control-center"
version = "4.6.0-rc1" version = "4.6.0-rc1"
dependencies = [ dependencies = [
"cargo-husky",
"daemon", "daemon",
"dirs", "dirs",
"eframe", "eframe",
@@ -2740,6 +2751,7 @@ dependencies = [
name = "rog_anime" name = "rog_anime"
version = "4.6.0-rc1" version = "4.6.0-rc1"
dependencies = [ dependencies = [
"cargo-husky",
"gif", "gif",
"glam", "glam",
"log", "log",
@@ -2756,6 +2768,7 @@ dependencies = [
name = "rog_aura" name = "rog_aura"
version = "4.6.0-rc1" version = "4.6.0-rc1"
dependencies = [ dependencies = [
"cargo-husky",
"log", "log",
"ron", "ron",
"serde", "serde",
@@ -2768,6 +2781,7 @@ dependencies = [
name = "rog_dbus" name = "rog_dbus"
version = "4.6.0-rc1" version = "4.6.0-rc1"
dependencies = [ dependencies = [
"cargo-husky",
"rog_anime", "rog_anime",
"rog_aura", "rog_aura",
"rog_platform", "rog_platform",
@@ -2779,6 +2793,7 @@ dependencies = [
name = "rog_platform" name = "rog_platform"
version = "4.6.0-rc1" version = "4.6.0-rc1"
dependencies = [ dependencies = [
"cargo-husky",
"concat-idents", "concat-idents",
"inotify", "inotify",
"log", "log",
@@ -2795,6 +2810,7 @@ dependencies = [
name = "rog_profiles" name = "rog_profiles"
version = "4.6.0-rc1" version = "4.6.0-rc1"
dependencies = [ dependencies = [
"cargo-husky",
"serde", "serde",
"serde_derive", "serde_derive",
"udev 0.7.0", "udev 0.7.0",

View File

@@ -52,3 +52,8 @@ opt-level = 1
[profile.bench] [profile.bench]
debug = false debug = false
opt-level = 3 opt-level = 3
[workspace.dependencies.cargo-husky]
version = "1"
default-features = false
features = ["user-hooks"]

View File

@@ -1,7 +1,7 @@
# https://github.com/ericseppanen/cargo-cranky # https://github.com/ericseppanen/cargo-cranky
# cargo install cargo-cranky && cargo cranky # cargo install cargo-cranky && cargo cranky
warn = [ error = [
"clippy::all", "clippy::all",
"clippy::await_holding_lock", "clippy::await_holding_lock",
"clippy::bool_to_int_with_if", "clippy::bool_to_int_with_if",

View File

@@ -126,6 +126,10 @@ You may also need to activate the service for debian install. If running Pop!_OS
Run `sudo make uninstall` in the source repo, and remove `/etc/asusd/`. Run `sudo make uninstall` in the source repo, and remove `/etc/asusd/`.
# Contributing
See `CONTRIBUTING.md`. Additionally, also do `cargo clean` and `cargo test` on first checkout to ensure the commit hooks are used (via `cargo-husky`).
# OTHER # OTHER
## Supporting more laptops ## Supporting more laptops

View File

@@ -22,3 +22,5 @@ gif.workspace = true
tinybmp.workspace = true tinybmp.workspace = true
glam.workspace = true glam.workspace = true
rog_dbus = { path = "../rog-dbus" } rog_dbus = { path = "../rog-dbus" }
cargo-husky.workspace = true

View File

@@ -36,15 +36,14 @@ fn main() {
..Default::default() ..Default::default()
}, },
Err(err) => { Err(err) => {
eprintln!("source {}", err); panic!("source {}", err);
std::process::exit(2);
} }
}; };
let (dbus, _) = RogDbusClientBlocking::new() let (dbus, _) = RogDbusClientBlocking::new()
.map_err(|e| { .map_err(|e| {
print_error_help(&e, None); print_error_help(&e, None);
std::process::exit(3); panic!("Could not start dbus client");
}) })
.unwrap(); .unwrap();
@@ -54,7 +53,7 @@ fn main() {
.supported_functions() .supported_functions()
.map_err(|e| { .map_err(|e| {
print_error_help(&e, None); print_error_help(&e, None);
std::process::exit(4); panic!("Could not start dbus proxy");
}) })
.unwrap(); .unwrap();
@@ -260,7 +259,7 @@ fn handle_anime(
if let Some(lst) = image.self_command_list() { if let Some(lst) = image.self_command_list() {
println!("\n{}", lst); println!("\n{}", lst);
} }
std::process::exit(1); return Ok(());
} }
verify_brightness(image.bright); verify_brightness(image.bright);
@@ -283,7 +282,7 @@ fn handle_anime(
if let Some(lst) = image.self_command_list() { if let Some(lst) = image.self_command_list() {
println!("\n{}", lst); println!("\n{}", lst);
} }
std::process::exit(1); return Ok(());
} }
verify_brightness(image.bright); verify_brightness(image.bright);
@@ -304,7 +303,7 @@ fn handle_anime(
if let Some(lst) = gif.self_command_list() { if let Some(lst) = gif.self_command_list() {
println!("\n{}", lst); println!("\n{}", lst);
} }
std::process::exit(1); return Ok(());
} }
verify_brightness(gif.bright); verify_brightness(gif.bright);
@@ -338,7 +337,7 @@ fn handle_anime(
if let Some(lst) = gif.self_command_list() { if let Some(lst) = gif.self_command_list() {
println!("\n{}", lst); println!("\n{}", lst);
} }
std::process::exit(1); return Ok(());
} }
verify_brightness(gif.bright); verify_brightness(gif.bright);
@@ -374,7 +373,6 @@ fn verify_brightness(brightness: f32) {
"Image and global brightness must be between 0.0 and 1.0 (inclusive), was {}", "Image and global brightness must be between 0.0 and 1.0 (inclusive), was {}",
brightness brightness
); );
std::process::exit(1);
} }
} }
@@ -391,7 +389,7 @@ fn handle_led_mode(
println!("Commands available"); println!("Commands available");
if let Some(cmdlist) = LedModeCommand::command_list() { if let Some(cmdlist) = LedModeCommand::command_list() {
let commands: Vec<String> = cmdlist.lines().map(|s| s.to_string()).collect(); let commands: Vec<String> = cmdlist.lines().map(|s| s.to_owned()).collect();
for command in commands.iter().filter(|command| { for command in commands.iter().filter(|command| {
for mode in &supported.basic_modes { for mode in &supported.basic_modes {
if command if command
@@ -662,7 +660,7 @@ fn handle_profile(
if let Some(lst) = cmd.self_command_list() { if let Some(lst) = cmd.self_command_list() {
println!("\n{}", lst); println!("\n{}", lst);
} }
std::process::exit(1); return Ok(());
} }
if cmd.next { if cmd.next {
@@ -706,14 +704,14 @@ fn handle_fan_curve(
if let Some(lst) = cmd.self_command_list() { if let Some(lst) = cmd.self_command_list() {
println!("\n{}", lst); println!("\n{}", lst);
} }
std::process::exit(1); return Ok(());
} }
if (cmd.enabled.is_some() || cmd.fan.is_some() || cmd.data.is_some()) if (cmd.enabled.is_some() || cmd.fan.is_some() || cmd.data.is_some())
&& cmd.mod_profile.is_none() && cmd.mod_profile.is_none()
{ {
println!("--enabled, --fan, and --data options require --mod-profile"); println!("--enabled, --fan, and --data options require --mod-profile");
std::process::exit(666); return Ok(());
} }
if cmd.get_enabled { if cmd.get_enabled {

View File

@@ -1,9 +1,9 @@
[package] [package]
name = "config-traits" name = "config-traits"
version = "0.1.0" license = "MPL-2.0"
authors = ["Luke D Jones <luke@ljones.dev>"]
edition = "2021" edition = "2021"
version.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
serde.workspace = true serde.workspace = true
@@ -13,3 +13,6 @@ toml.workspace = true
ron.workspace = true ron.workspace = true
log.workspace = true log.workspace = true
[dev-dependencies]
cargo-husky.workspace = true

10
config-traits/README.md Normal file
View File

@@ -0,0 +1,10 @@
# config-traits
`config_traits` is a crate that broke out from the requirement to manage various
different config files, including parsing from different formats and updating
them from previous versions where fields or names are changed in some way.
The end canonical file format is `.ron` as this supports rust types well, and includes
the ability to add commenting, and is less verbose than `json`. Currently the crate will
also try to parse from `json` and `toml` if the `ron` parsing fails, then update to `ron`
format.

View File

@@ -1,4 +1,14 @@
use std::fs::{create_dir, File, OpenOptions}; //! `config_traits` is a crate that broke out from the requirement to manage
//! various different config files, including parsing from different formats and
//! updating them from previous versions where fields or names are changed in
//! some way.
//!
//! The end canonical file format is `.ron` as this supports rust types well,
//! and includes the ability to add commenting, and is less verbose than `json`.
//! Currently the crate will also try to parse from `json` and `toml` if the
//! `ron` parsing fails, then update to `ron` format.
use std::fs::{self, create_dir, File, OpenOptions};
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::path::PathBuf; use std::path::PathBuf;
@@ -49,7 +59,7 @@ where
"Could not rename. Please remove {} then restart service: Error {}", "Could not rename. Please remove {} then restart service: Error {}",
self.file_name(), self.file_name(),
err err
) );
}); });
do_rename = false; do_rename = false;
} }
@@ -68,7 +78,7 @@ where
"Could not rename. Please remove {} then restart service: Error {}", "Could not rename. Please remove {} then restart service: Error {}",
self.file_name(), self.file_name(),
err err
) );
}); });
} }
config config
@@ -88,18 +98,10 @@ where
/// Open and parse the config file to self from ron format /// Open and parse the config file to self from ron format
fn read(&mut self) { fn read(&mut self) {
let mut file = match OpenOptions::new().read(true).open(self.file_path()) { if let Ok(data) = fs::read_to_string(self.file_path()) {
Ok(data) => data, if data.is_empty() {
Err(err) => {
error!("Error reading {:?}: {}", self.file_path(), err);
return;
}
};
let mut buf = String::new();
if let Ok(l) = file.read_to_string(&mut buf) {
if l == 0 {
warn!("File is empty {:?}", self.file_path()); warn!("File is empty {:?}", self.file_path());
} else if let Ok(data) = ron::from_str(&buf) { } else if let Ok(data) = ron::from_str(&data) {
*self = data; *self = data;
} else { } else {
warn!("Could not deserialise {:?}", self.file_path()); warn!("Could not deserialise {:?}", self.file_path());
@@ -137,13 +139,14 @@ where
self.file_name(), self.file_name(),
self.file_name() self.file_name()
); );
let cfg_old = self.file_path().to_string_lossy().to_string() + "-old"; let mut cfg_old = self.file_path().to_string_lossy().to_string();
cfg_old.push_str("-old");
std::fs::rename(self.file_path(), cfg_old).unwrap_or_else(|err| { std::fs::rename(self.file_path(), cfg_old).unwrap_or_else(|err| {
error!( error!(
"Could not rename. Please remove {} then restart service: Error {}", "Could not rename. Please remove {} then restart service: Error {}",
self.file_name(), self.file_name(),
err err
) );
}); });
} }
} }
@@ -206,7 +209,9 @@ macro_rules! std_config_load {
self = data; self = data;
} else if let Ok(data) = toml::from_str(&buf) { } else if let Ok(data) = toml::from_str(&buf) {
self = data; self = data;
} $(else if let Ok(data) = serde_json::from_str::<$generic>(&buf) { } $(else if let Ok(data) = ron::from_str::<$generic>(&buf) {
self = data.into();
} else if let Ok(data) = serde_json::from_str::<$generic>(&buf) {
self = data.into(); self = data.into();
} else if let Ok(data) = toml::from_str::<$generic>(&buf) { } else if let Ok(data) = toml::from_str::<$generic>(&buf) {
self = data.into(); self = data.into();

View File

@@ -34,3 +34,6 @@ zbus.workspace = true
# cli and logging # cli and logging
log.workspace = true log.workspace = true
env_logger.workspace = true env_logger.workspace = true
[dev-dependencies]
cargo-husky.workspace = true

View File

@@ -1,5 +1,4 @@
use std::fs::OpenOptions; use std::io::Write;
use std::io::{Read, Write};
use std::path::PathBuf; use std::path::PathBuf;
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
@@ -78,17 +77,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
// if supported.keyboard_led.per_key_led_mode { // if supported.keyboard_led.per_key_led_mode {
if let Some(cfg) = config.active_aura { if let Some(cfg) = config.active_aura {
let mut aura_config = ConfigAura::new().set_name(cfg).load(); let mut aura_config = ConfigAura::new().set_name(cfg).load();
// let baord_name = std::fs::read_to_string(BOARD_NAME)?;
// Find and load a matching layout for laptop
let mut file = OpenOptions::new()
.read(true)
.open(PathBuf::from(BOARD_NAME))
.map_err(|e| {
println!("{BOARD_NAME}, {e}");
e
})?;
let mut board_name = String::new();
file.read_to_string(&mut board_name)?;
let led_support = LaptopLedData::get_data(); let led_support = LaptopLedData::get_data();

View File

@@ -1,6 +1,6 @@
//! # DBus interface proxy for: `org.asuslinux.Daemon` //! # `DBus` interface proxy for: `org.asuslinux.Daemon`
//! //!
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection //! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
//! data. Source: `Interface '/org/asuslinux/Anime' from service //! data. Source: `Interface '/org/asuslinux/Anime' from service
//! 'org.asuslinux.Daemon' on session bus`. //! 'org.asuslinux.Daemon' on session bus`.
//! //!
@@ -10,8 +10,8 @@
//! [Writing a client proxy](https://dbus.pages.freedesktop.org/zbus/client.html) //! [Writing a client proxy](https://dbus.pages.freedesktop.org/zbus/client.html)
//! section of the zbus documentation. //! section of the zbus documentation.
//! //!
//! This DBus object implements //! This `DBus` object implements
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html), //! [standard `DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used: //! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
//! //!
//! * [`zbus::fdo::PeerProxy`] //! * [`zbus::fdo::PeerProxy`]

View File

@@ -45,3 +45,6 @@ sysfs-class.workspace = true # used for backlight control and baord ID
concat-idents.workspace = true concat-idents.workspace = true
systemd-zbus = "*" systemd-zbus = "*"
[dev-dependencies]
cargo-husky.workspace = true

View File

@@ -29,7 +29,7 @@ impl StdConfig for Config {
} }
fn file_name(&self) -> String { fn file_name(&self) -> String {
CONFIG_FILE.to_string() CONFIG_FILE.to_owned()
} }
} }

View File

@@ -145,7 +145,7 @@ impl StdConfig for AnimeConfig {
} }
fn file_name(&self) -> String { fn file_name(&self) -> String {
CONFIG_FILE.to_string() CONFIG_FILE.to_owned()
} }
} }

View File

@@ -195,7 +195,7 @@ impl StdConfig for AuraConfig {
} }
fn file_name(&self) -> String { fn file_name(&self) -> String {
CONFIG_FILE.to_string() CONFIG_FILE.to_owned()
} }
} }

View File

@@ -1,4 +1,4 @@
pub mod config; pub mod config;
pub mod controller; pub mod controller;
/// Implements CtrlTask, Reloadable, ZbusRun /// Implements `CtrlTask`, `Reloadable`, `ZbusRun`
pub mod trait_impls; pub mod trait_impls;

View File

@@ -92,15 +92,8 @@ impl CtrlPlatform {
} }
pub fn get_boot_sound() -> Result<i8, RogError> { pub fn get_boot_sound() -> Result<i8, RogError> {
let path = ASUS_POST_LOGO_SOUND; let data = std::fs::read(ASUS_POST_LOGO_SOUND)
let mut file = OpenOptions::new() .map_err(|err| RogError::Read(ASUS_POST_LOGO_SOUND.into(), err))?;
.read(true)
.open(path)
.map_err(|err| RogError::Path(path.into(), err))?;
let mut data = Vec::new();
file.read_to_end(&mut data)
.map_err(|err| RogError::Read(path.into(), err))?;
let idx = data.len() - 1; let idx = data.len() - 1;
Ok(data[idx] as i8) Ok(data[idx] as i8)
@@ -115,6 +108,7 @@ impl CtrlPlatform {
.map_err(|err| RogError::Path(path.into(), err))?; .map_err(|err| RogError::Path(path.into(), err))?;
let mut data = Vec::new(); let mut data = Vec::new();
#[allow(clippy::verbose_file_reads)]
file.read_to_end(&mut data) file.read_to_end(&mut data)
.map_err(|err| RogError::Read(path.into(), err))?; .map_err(|err| RogError::Read(path.into(), err))?;

View File

@@ -28,7 +28,7 @@ impl StdConfig for ProfileConfig {
} }
fn file_name(&self) -> String { fn file_name(&self) -> String {
CONFIG_FILE.to_string() CONFIG_FILE.to_owned()
} }
} }
@@ -77,7 +77,7 @@ impl StdConfig for FanCurveConfig {
} }
fn file_name(&self) -> String { fn file_name(&self) -> String {
CONFIG_FAN_FILE.to_string() CONFIG_FAN_FILE.to_owned()
} }
} }

View File

@@ -33,3 +33,6 @@ zbus = { workspace = true, optional = true }
sysfs-class = { workspace = true, optional = true } sysfs-class = { workspace = true, optional = true }
uhid-virt = "^0.0.5" uhid-virt = "^0.0.5"
[dev-dependencies]
cargo-husky.workspace = true

View File

@@ -141,7 +141,9 @@ impl AnimeImage {
/// ///
/// In relation to the display itself you should think of it as a full /// In relation to the display itself you should think of it as a full
/// square grid, so `first_x` is the x position on that grid where the /// square grid, so `first_x` is the x position on that grid where the
/// LED is actually positioned in relation to the Y. ```text /// LED is actually positioned in relation to the Y.
///
/// ```text
/// +------------+ /// +------------+
/// | | /// | |
/// | | /// | |

View File

@@ -28,3 +28,6 @@ log.workspace = true
sysfs-class.workspace = true # used for backlight control and baord ID sysfs-class.workspace = true # used for backlight control and baord ID
ron = { version = "*", optional = true } ron = { version = "*", optional = true }
[dev-dependencies]
cargo-husky.workspace = true

View File

@@ -303,6 +303,7 @@ impl LedUsbPackets {
fn rgb_for_led_code(&mut self, led_code: LedCode) -> Option<&mut [u8]> { fn rgb_for_led_code(&mut self, led_code: LedCode) -> Option<&mut [u8]> {
let zoned = self.zoned; let zoned = self.zoned;
// Tuples are indexes in to array // Tuples are indexes in to array
#[allow(clippy::match_same_arms)]
let (row, col) = match led_code { let (row, col) = match led_code {
LedCode::VolDown => (0, 15), LedCode::VolDown => (0, 15),
LedCode::VolUp => (0, 18), LedCode::VolUp => (0, 18),

View File

@@ -8,6 +8,7 @@ impl From<LedCode> for &str {
impl From<&LedCode> for &str { impl From<&LedCode> for &str {
fn from(k: &LedCode) -> Self { fn from(k: &LedCode) -> Self {
#[allow(clippy::match_same_arms)]
match k { match k {
LedCode::VolUp => "Volume Up", LedCode::VolUp => "Volume Up",
LedCode::VolDown => "Volume Down", LedCode::VolDown => "Volume Down",

View File

@@ -1,6 +1,3 @@
use std::fs::OpenOptions;
use std::io::Read;
use log::{error, info, warn}; use log::{error, info, warn};
use serde_derive::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
@@ -76,39 +73,33 @@ impl LedSupportFile {
let mut loaded = false; let mut loaded = false;
let mut data = LedSupportFile::default(); let mut data = LedSupportFile::default();
// Load user configs first so they are first to be checked // Load user configs first so they are first to be checked
if let Ok(mut file) = OpenOptions::new().read(true).open(ASUS_LED_MODE_USER_CONF) { if let Ok(file) = std::fs::read_to_string(ASUS_LED_MODE_USER_CONF) {
let mut buf = String::new(); if file.is_empty() {
if let Ok(l) = file.read_to_string(&mut buf) { warn!("{} is empty", ASUS_LED_MODE_USER_CONF);
if l == 0 { } else {
warn!("{} is empty", ASUS_LED_MODE_USER_CONF); if let Ok(mut tmp) = ron::from_str::<LedSupportFile>(&file) {
} else { data.0.append(&mut tmp.0);
if let Ok(mut tmp) = ron::from_str::<LedSupportFile>(&buf) {
data.0.append(&mut tmp.0);
}
info!(
"Loaded user-defined LED support data from {}",
ASUS_LED_MODE_USER_CONF
);
} }
info!(
"Loaded user-defined LED support data from {}",
ASUS_LED_MODE_USER_CONF
);
} }
} }
// Load and append the default LED support data // Load and append the default LED support data
if let Ok(mut file) = OpenOptions::new().read(true).open(ASUS_LED_MODE_CONF) { if let Ok(file) = std::fs::read_to_string(ASUS_LED_MODE_CONF) {
let mut buf = String::new(); if file.is_empty() {
if let Ok(l) = file.read_to_string(&mut buf) { warn!("{} is empty", ASUS_LED_MODE_CONF);
if l == 0 { } else {
warn!("{} is empty", ASUS_LED_MODE_CONF); let mut tmp: LedSupportFile = ron::from_str(&file)
} else { .map_err(|e| error!("{e}"))
let mut tmp: LedSupportFile = ron::from_str(&buf) .unwrap_or_else(|_| panic!("Could not deserialise {}", ASUS_LED_MODE_CONF));
.map_err(|e| error!("{e}")) data.0.append(&mut tmp.0);
.unwrap_or_else(|_| panic!("Could not deserialise {}", ASUS_LED_MODE_CONF)); loaded = true;
data.0.append(&mut tmp.0); info!(
loaded = true; "Loaded default LED support data from {}",
info!( ASUS_LED_MODE_CONF
"Loaded default LED support data from {}", );
ASUS_LED_MODE_CONF
);
}
} }
} }
data.0.sort_by(|a, b| a.board_name.cmp(&b.board_name)); data.0.sort_by(|a, b| a.board_name.cmp(&b.board_name));
@@ -125,7 +116,7 @@ impl LedSupportFile {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::fs::OpenOptions; use std::fs::OpenOptions;
use std::io::{Read, Write}; use std::io::Write;
use std::path::PathBuf; use std::path::PathBuf;
use ron::ser::PrettyConfig; use ron::ser::PrettyConfig;
@@ -155,9 +146,7 @@ mod tests {
let mut data = PathBuf::from(env!("CARGO_MANIFEST_DIR")); let mut data = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
data.push("data/aura_support.ron"); data.push("data/aura_support.ron");
let mut file = OpenOptions::new().read(true).open(&data).unwrap(); let buf = std::fs::read_to_string(&data).unwrap();
let mut buf = String::new();
file.read_to_string(&mut buf).unwrap();
let tmp = ron::from_str::<LedSupportFile>(&buf).unwrap(); let tmp = ron::from_str::<LedSupportFile>(&buf).unwrap();

View File

@@ -284,7 +284,8 @@ impl FromStr for AuraZone {
} }
/// Default factory modes structure. This easily converts to an USB HID packet /// Default factory modes structure. This easily converts to an USB HID packet
/// with: ```rust /// with:
/// ```rust
/// // let bytes: [u8; LED_MSG_LEN] = mode.into(); /// // let bytes: [u8; LED_MSG_LEN] = mode.into();
/// ``` /// ```
#[cfg_attr(feature = "dbus", derive(Type))] #[cfg_attr(feature = "dbus", derive(Type))]
@@ -350,6 +351,7 @@ pub struct AuraParameters {
pub direction: bool, pub direction: bool,
} }
#[allow(clippy::fn_params_excessive_bools)]
impl AuraParameters { impl AuraParameters {
pub const fn new( pub const fn new(
zone: bool, zone: bool,

View File

@@ -28,6 +28,6 @@ impl EffectState for InputBased {
} }
fn set_led(&mut self, address: LedCode) { fn set_led(&mut self, address: LedCode) {
self.led = address self.led = address;
} }
} }

View File

@@ -2,8 +2,6 @@
//! editable config. //! editable config.
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::fs::{self, OpenOptions};
use std::io::Read;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::slice::Iter; use std::slice::Iter;
@@ -88,8 +86,8 @@ impl KeyShape {
/// The first `Key` will determine the row height. /// The first `Key` will determine the row height.
/// ///
/// Every row is considered to start a x=0, with the first row being y=0, /// Every row is considered to start a x=0, with the first row being y=0,
/// and following rows starting after the previous row_y+pad_top and /// and following rows starting after the previous `row_y + pad_top` and
/// row_x+pad_left /// `row_x + pad_left`
#[derive(Debug, Deserialize, Serialize, Clone)] #[derive(Debug, Deserialize, Serialize, Clone)]
pub struct KeyRow { pub struct KeyRow {
pad_left: f32, pad_left: f32,
@@ -138,7 +136,7 @@ impl KeyRow {
}; };
if h < height { if h < height {
h = height h = height;
} }
} }
h h
@@ -192,15 +190,9 @@ pub struct KeyLayout {
impl KeyLayout { impl KeyLayout {
pub fn from_file(path: &Path) -> Result<Self, Error> { pub fn from_file(path: &Path) -> Result<Self, Error> {
let mut file = OpenOptions::new() let buf: String = std::fs::read_to_string(path)
.read(true)
.open(path)
.map_err(|e| Error::IoPath(path.to_string_lossy().to_string(), e))?; .map_err(|e| Error::IoPath(path.to_string_lossy().to_string(), e))?;
let mut buf = String::new(); if buf.is_empty() {
let read_len = file
.read_to_string(&mut buf)
.map_err(|e| Error::IoPath(path.to_string_lossy().to_string(), e))?;
if read_len == 0 {
Err(Error::IoPath( Err(Error::IoPath(
path.to_string_lossy().to_string(), path.to_string_lossy().to_string(),
std::io::ErrorKind::InvalidData.into(), std::io::ErrorKind::InvalidData.into(),
@@ -233,7 +225,7 @@ impl KeyLayout {
} }
} }
pub fn rows(&self) -> Iter<KeyRow> { pub fn rows(&self) -> Iter<'_, KeyRow> {
self.key_rows.iter() self.key_rows.iter()
} }
@@ -279,7 +271,7 @@ impl KeyLayout {
for r in &self.key_rows { for r in &self.key_rows {
let tmp = r.width(); let tmp = r.width();
if width < tmp { if width < tmp {
width = tmp width = tmp;
} }
} }
width width
@@ -305,7 +297,7 @@ impl KeyLayout {
data_path.push("layouts"); data_path.push("layouts");
let path = data_path.as_path(); let path = data_path.as_path();
let mut files = Vec::new(); let mut files = Vec::new();
fs::read_dir(path) std::fs::read_dir(path)
.map_err(|e| { .map_err(|e| {
println!("{:?}, {e}", path); println!("{:?}, {e}", path);
e e
@@ -471,7 +463,6 @@ mod tests {
data_path.push("data"); data_path.push("data");
data_path.push("layouts"); data_path.push("layouts");
let path = data_path.as_path(); let path = data_path.as_path();
let mut buf = String::new();
for p in fs::read_dir(path) for p in fs::read_dir(path)
.map_err(|e| { .map_err(|e| {
println!("{:?}, {e}", path); println!("{:?}, {e}", path);
@@ -479,9 +470,7 @@ mod tests {
}) })
.unwrap() .unwrap()
{ {
let path = p.unwrap().path(); let mut buf = std::fs::read_to_string(p.unwrap().path()).unwrap();
let mut file = OpenOptions::new().read(true).open(&path).unwrap();
file.read_to_string(&mut buf).unwrap();
let data: KeyLayout = ron::from_str(&buf).unwrap(); let data: KeyLayout = ron::from_str(&buf).unwrap();
@@ -501,9 +490,10 @@ mod tests {
} }
} }
if !unused.is_empty() { assert!(
panic!("The layout {path:?} had unused shapes {unused:?}",); unused.is_empty(),
} "The layout {path:?} had unused shapes {unused:?}",
);
buf.clear(); buf.clear();
} }
@@ -527,9 +517,7 @@ mod tests {
data_path.push("data"); data_path.push("data");
data_path.push("aura_support.ron"); data_path.push("aura_support.ron");
let mut buf = String::new(); let mut buf = std::fs::read_to_string(&data_path).unwrap();
let mut file = OpenOptions::new().read(true).open(&data_path).unwrap();
file.read_to_string(&mut buf).unwrap();
let data: LedSupportFile = ron::from_str(&buf).unwrap(); let data: LedSupportFile = ron::from_str(&buf).unwrap();
data_path.pop(); data_path.pop();
@@ -553,6 +541,7 @@ mod tests {
) )
}) })
.unwrap(); .unwrap();
#[allow(clippy::verbose_file_reads)]
if let Err(e) = file.read_to_string(&mut buf) { if let Err(e) = file.read_to_string(&mut buf) {
panic!( panic!(
"Error checking {data_path:?} for {} : {e:?}", "Error checking {data_path:?} for {} : {e:?}",

View File

@@ -41,3 +41,6 @@ png_pong.workspace = true
nix = "^0.26.1" nix = "^0.26.1"
tempfile = "3.3.0" tempfile = "3.3.0"
[dev-dependencies]
cargo-husky.workspace = true

View File

@@ -60,6 +60,8 @@ impl Config {
let mut buf = String::new(); let mut buf = String::new();
// Lint to allow, because we want the above file behaviour
#[allow(clippy::verbose_file_reads)]
if let Ok(read_len) = file.read_to_string(&mut buf) { if let Ok(read_len) = file.read_to_string(&mut buf) {
if read_len == 0 { if read_len == 0 {
warn!("Zero len read of Config file"); warn!("Zero len read of Config file");

View File

@@ -81,6 +81,8 @@ pub fn on_tmp_dir_exists() -> Result<TempDir, std::io::Error> {
// First entry is the actual state // First entry is the actual state
if buf[0] == SHOWING_GUI { if buf[0] == SHOWING_GUI {
ipc_file.write_all(&[SHOWING_GUI])?; // Store state again as we drained the fifo ipc_file.write_all(&[SHOWING_GUI])?; // Store state again as we drained the fifo
// Early exit is not an error and we don't want to pass back a dir
#[allow(clippy::exit)]
exit(0); exit(0);
} else if buf[0] == SHOW_GUI { } else if buf[0] == SHOW_GUI {
remove_dir_all(&path)?; remove_dir_all(&path)?;
@@ -89,7 +91,7 @@ pub fn on_tmp_dir_exists() -> Result<TempDir, std::io::Error> {
.rand_bytes(0) .rand_bytes(0)
.tempdir(); .tempdir();
} }
exit(-1); panic!("Invalid exit or app state");
} }
pub fn get_ipc_file() -> Result<File, crate::error::Error> { pub fn get_ipc_file() -> Result<File, crate::error::Error> {

View File

@@ -1,5 +1,4 @@
use std::env::args; use std::env::args;
use std::fs::OpenOptions;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
@@ -101,15 +100,10 @@ fn main() -> Result<()> {
let enabled_notifications = EnabledNotifications::tokio_mutex(&config); let enabled_notifications = EnabledNotifications::tokio_mutex(&config);
// Find and load a matching layout for laptop // Find and load a matching layout for laptop
let mut file = OpenOptions::new() let mut board_name = std::fs::read_to_string(BOARD_NAME).map_err(|e| {
.read(true) println!("DOH! {BOARD_NAME}, {e}");
.open(PathBuf::from(BOARD_NAME)) e
.map_err(|e| { })?;
println!("DOH! {BOARD_NAME}, {e}");
e
})?;
let mut board_name = String::new();
file.read_to_string(&mut board_name)?;
let mut led_support = LaptopLedData::get_data(); let mut led_support = LaptopLedData::get_data();
@@ -122,7 +116,7 @@ fn main() -> Result<()> {
path.push("rog-aura"); path.push("rog-aura");
path.push("data"); path.push("data");
} }
layouts = KeyLayout::layout_files(path.to_owned()).unwrap(); layouts = KeyLayout::layout_files(path.clone()).unwrap();
if let Some(name) = &cli_parsed.board_name { if let Some(name) = &cli_parsed.board_name {
if let Some(modes) = LedSupportFile::load_from_config() { if let Some(modes) = LedSupportFile::load_from_config() {
@@ -130,7 +124,7 @@ fn main() -> Result<()> {
led_support = data; led_support = data;
} }
} }
board_name = name.to_owned(); board_name = name.clone();
for layout in &layouts { for layout in &layouts {
if layout if layout
.file_name() .file_name()
@@ -138,11 +132,11 @@ fn main() -> Result<()> {
.to_string_lossy() .to_string_lossy()
.contains(&led_support.layout_name.to_lowercase()) .contains(&led_support.layout_name.to_lowercase())
{ {
layout_name = Some(layout.to_owned()); layout_name = Some(layout.clone());
} }
} }
} else { } else {
board_name = "GQ401QM".to_string() board_name = "GQ401QM".to_owned();
}; };
if cli_parsed.layout_viewing { if cli_parsed.layout_viewing {
@@ -182,7 +176,7 @@ fn main() -> Result<()> {
layout_name, layout_name,
layout, layout,
layouts, layouts,
enabled_notifications, &enabled_notifications,
&config, &config,
&supported, &supported,
)?; )?;
@@ -222,7 +216,7 @@ fn setup_page_state_and_notifs(
layout_testing: Option<PathBuf>, layout_testing: Option<PathBuf>,
keyboard_layout: KeyLayout, keyboard_layout: KeyLayout,
keyboard_layouts: Vec<PathBuf>, keyboard_layouts: Vec<PathBuf>,
enabled_notifications: Arc<Mutex<EnabledNotifications>>, enabled_notifications: &Arc<Mutex<EnabledNotifications>>,
config: &Config, config: &Config,
supported: &SupportedFunctions, supported: &SupportedFunctions,
) -> Result<Arc<Mutex<SystemState>>> { ) -> Result<Arc<Mutex<SystemState>>> {
@@ -234,7 +228,7 @@ fn setup_page_state_and_notifs(
supported, supported,
)?)); )?));
start_notifications(config, page_states.clone(), enabled_notifications)?; start_notifications(config, &page_states, enabled_notifications)?;
Ok(page_states) Ok(page_states)
} }
@@ -253,21 +247,15 @@ fn start_app(states: Arc<Mutex<SystemState>>, native_options: NativeOptions) ->
/// Bah.. the icon dosn't work on wayland anyway, but we'll leave it in for now. /// Bah.. the icon dosn't work on wayland anyway, but we'll leave it in for now.
fn load_icon() -> IconData { fn load_icon() -> IconData {
let path = PathBuf::from(APP_ICON_PATH); let path = PathBuf::from(APP_ICON_PATH);
let mut buf = Vec::new();
let mut rgba = Vec::new(); let mut rgba = Vec::new();
let mut height = 512; let mut height = 512;
let mut width = 512; let mut width = 512;
if path.exists() { if path.exists() {
if let Ok(mut file) = OpenOptions::new() if let Ok(data) = std::fs::read(path)
.read(true) .map_err(|e| error!("Error reading app icon: {e:?}"))
.open(path)
.map_err(|e| error!("Error opening app icon: {e:?}")) .map_err(|e| error!("Error opening app icon: {e:?}"))
{ {
file.read_to_end(&mut buf) let data = std::io::Cursor::new(data);
.map_err(|e| error!("Error reading app icon: {e:?}"))
.ok();
let data = std::io::Cursor::new(buf);
let decoder = png_pong::Decoder::new(data).unwrap().into_steps(); let decoder = png_pong::Decoder::new(data).unwrap().into_steps();
let png_pong::Step { raster, delay: _ } = decoder.last().unwrap().unwrap(); let png_pong::Step { raster, delay: _ } = decoder.last().unwrap().unwrap();
@@ -295,7 +283,7 @@ fn do_cli_help(parsed: &CliStart) -> bool {
println!(); println!();
if let Some(cmdlist) = CliStart::command_list() { if let Some(cmdlist) = CliStart::command_list() {
let commands: Vec<String> = cmdlist.lines().map(|s| s.to_owned()).collect(); let commands: Vec<String> = cmdlist.lines().map(|s| s.to_owned()).collect();
for command in commands.iter() { for command in &commands {
println!("{}", command); println!("{}", command);
} }
} }

View File

@@ -473,13 +473,11 @@ pub fn init_tray(
}; };
std::thread::spawn(move || { std::thread::spawn(move || {
if gtk::init() let gtk_init = gtk::init().map_err(|e| {
.map_err(|e| { error!("ROGTray: gtk init {e}");
error!("ROGTray: gtk init {e}"); e
e });
}) if gtk_init.is_err() {
.is_err()
{
return; return;
} // Make this the main thread for gtk } // Make this the main thread for gtk
debug!("init_tray gtk"); debug!("init_tray gtk");

View File

@@ -139,8 +139,8 @@ type SharedHandle = Arc<Mutex<Option<NotificationHandle>>>;
pub fn start_notifications( pub fn start_notifications(
config: &Config, config: &Config,
page_states: Arc<Mutex<SystemState>>, page_states: &Arc<Mutex<SystemState>>,
enabled_notifications: Arc<Mutex<EnabledNotifications>>, enabled_notifications: &Arc<Mutex<EnabledNotifications>>,
) -> Result<()> { ) -> Result<()> {
let last_notification: SharedHandle = Arc::new(Mutex::new(None)); let last_notification: SharedHandle = Arc::new(Mutex::new(None));
@@ -556,7 +556,7 @@ fn do_mux_notification(message: &str, m: &GpuMode) -> Result<()> {
} else if id == "__closed" { } else if id == "__closed" {
// TODO: cancel the switching // TODO: cancel the switching
} }
}) });
}); });
Ok(()) Ok(())
} }

View File

@@ -25,7 +25,7 @@ pub fn keyboard(
AdvancedAuraType::None => (false, keyboard_layout.max_width(), false), AdvancedAuraType::None => (false, keyboard_layout.max_width(), false),
AdvancedAuraType::Zoned(zones) => { AdvancedAuraType::Zoned(zones) => {
let width = if let Some(row) = keyboard_layout.rows_ref().get(2) { let width = if let Some(row) = keyboard_layout.rows_ref().get(2) {
row.width() as f32 row.width()
} else { } else {
0.0 0.0
}; };

View File

@@ -15,3 +15,6 @@ rog_aura = { path = "../rog-aura" }
rog_profiles = { path = "../rog-profiles" } rog_profiles = { path = "../rog-profiles" }
rog_platform = { path = "../rog-platform" } rog_platform = { path = "../rog-platform" }
zbus.workspace = true zbus.workspace = true
[dev-dependencies]
cargo-husky.workspace = true

View File

@@ -1,6 +1,6 @@
//! # DBus interface proxy for: `org.asuslinux.Daemon` //! # `DBus` interface proxy for: `org.asuslinux.Daemon`
//! //!
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection //! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
//! data. Source: `Interface '/org/asuslinux/Aura' from service //! data. Source: `Interface '/org/asuslinux/Aura' from service
//! 'org.asuslinux.Daemon' on system bus`. //! 'org.asuslinux.Daemon' on system bus`.
//! //!
@@ -10,8 +10,8 @@
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html) //! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
//! section of the zbus documentation. //! section of the zbus documentation.
//! //!
//! This DBus object implements //! This `DBus` object implements
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html), //! [standard `DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used: //! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
//! //!
//! * [`zbus::fdo::PeerProxy`] //! * [`zbus::fdo::PeerProxy`]

View File

@@ -1,6 +1,6 @@
//! # DBus interface proxy for: `org.asuslinux.Daemon` //! # `DBus` interface proxy for: `org.asuslinux.Daemon`
//! //!
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection //! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
//! data. Source: `Interface '/org/asuslinux/Platform' from service //! data. Source: `Interface '/org/asuslinux/Platform' from service
//! 'org.asuslinux.Daemon' on system bus`. //! 'org.asuslinux.Daemon' on system bus`.
//! //!
@@ -10,8 +10,8 @@
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html) //! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
//! section of the zbus documentation. //! section of the zbus documentation.
//! //!
//! This DBus object implements //! This `DBus` object implements
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html), //! [standard `DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used: //! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
//! //!
//! * [`zbus::fdo::PropertiesProxy`] //! * [`zbus::fdo::PropertiesProxy`]

View File

@@ -1,6 +1,6 @@
//! # DBus interface proxy for: `org.asuslinux.Daemon` //! # `DBus` interface proxy for: `org.asuslinux.Daemon`
//! //!
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection //! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
//! data. Source: `Interface '/org/asuslinux/Charge' from service //! data. Source: `Interface '/org/asuslinux/Charge' from service
//! 'org.asuslinux.Daemon' on system bus`. //! 'org.asuslinux.Daemon' on system bus`.
//! //!
@@ -10,8 +10,8 @@
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html) //! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
//! section of the zbus documentation. //! section of the zbus documentation.
//! //!
//! This DBus object implements //! This `DBus` object implements
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html), //! [standard `DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used: //! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
//! //!
//! * [`zbus::fdo::PropertiesProxy`] //! * [`zbus::fdo::PropertiesProxy`]

View File

@@ -1,6 +1,6 @@
//! # DBus interface proxy for: `org.asuslinux.Daemon` //! # `DBus` interface proxy for: `org.asuslinux.Daemon`
//! //!
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection //! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
//! data. Source: `Interface '/org/asuslinux/Profile' from service //! data. Source: `Interface '/org/asuslinux/Profile' from service
//! 'org.asuslinux.Daemon' on system bus`. //! 'org.asuslinux.Daemon' on system bus`.
//! //!
@@ -10,8 +10,8 @@
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html) //! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
//! section of the zbus documentation. //! section of the zbus documentation.
//! //!
//! This DBus object implements //! This `DBus object implements
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html), //! [standard DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used: //! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
//! //!
//! * [`zbus::fdo::IntrospectableProxy`] //! * [`zbus::fdo::IntrospectableProxy`]

View File

@@ -1,6 +1,6 @@
//! # DBus interface proxy for: `org.asuslinux.Daemon` //! # `DBus` interface proxy for: `org.asuslinux.Daemon`
//! //!
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection //! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
//! data. Source: `Interface '/org/asuslinux/Supported' from service //! data. Source: `Interface '/org/asuslinux/Supported' from service
//! 'org.asuslinux.Daemon' on system bus`. //! 'org.asuslinux.Daemon' on system bus`.
//! //!
@@ -10,8 +10,8 @@
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html) //! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
//! section of the zbus documentation. //! section of the zbus documentation.
//! //!
//! This DBus object implements //! This `DBus` object implements
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html), //! [standard `DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used: //! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
//! //!
//! * [`zbus::fdo::PeerProxy`] //! * [`zbus::fdo::PeerProxy`]

View File

@@ -16,3 +16,6 @@ udev.workspace = true
inotify.workspace = true inotify.workspace = true
rusb.workspace = true rusb.workspace = true
[dev-dependencies]
cargo-husky.workspace = true

View File

@@ -51,7 +51,7 @@ pub fn write_attr_bool(device: &mut Device, attr: &str, value: bool) -> Result<(
pub fn read_attr_u8(device: &Device, attr_name: &str) -> Result<u8> { pub fn read_attr_u8(device: &Device, attr_name: &str) -> Result<u8> {
if let Some(value) = device.attribute_value(attr_name) { if let Some(value) = device.attribute_value(attr_name) {
let tmp = value.to_string_lossy(); let tmp = value.to_string_lossy();
return tmp.parse::<u8>().map_err(|_| PlatformError::ParseNum); return tmp.parse::<u8>().map_err(|_e| PlatformError::ParseNum);
} }
Err(PlatformError::AttrNotFound(attr_name.to_owned())) Err(PlatformError::AttrNotFound(attr_name.to_owned()))
} }
@@ -114,41 +114,3 @@ mod tests {
assert_eq!(tmp, &[1, 2, 3, 4, 5]); assert_eq!(tmp, &[1, 2, 3, 4, 5]);
} }
} }
// pub fn find_led_node(id_product: &str) -> Result<Device, PlatformError> {
// let mut enumerator = udev::Enumerator::new().map_err(|err| {
// warn!("{}", err);
// PlatformError::Udev("enumerator failed".into(), err)
// })?;
// enumerator.match_subsystem("hidraw").map_err(|err| {
// warn!("{}", err);
// PlatformError::Udev("match_subsystem failed".into(), err)
// })?;
// for device in enumerator.scan_devices().map_err(|err| {
// warn!("{}", err);
// PlatformError::Udev("scan_devices failed".into(), err)
// })? {
// if let Some(parent) = device
// .parent_with_subsystem_devtype("usb", "usb_device")
// .map_err(|err| {
// warn!("{}", err);
// PlatformError::Udev("parent_with_subsystem_devtype
// failed".into(), err) })?
// {
// if parent
// .attribute_value("idProduct")
// .ok_or_else(|| PlatformError::NotFound("LED
// idProduct".into()))? == id_product
// {
// if let Some(dev_node) = device.devnode() {
// info!("Using device at: {:?} for LED control", dev_node);
// return Ok(device);
// }
// }
// }
// }
// Err(PlatformError::MissingFunction(
// "ASUS LED device node not found".into(),
// ))
// }

View File

@@ -15,3 +15,6 @@ serde.workspace = true
serde_derive.workspace = true serde_derive.workspace = true
zbus = { workspace = true, optional = true } zbus = { workspace = true, optional = true }
[dev-dependencies]
cargo-husky.workspace = true

View File

@@ -19,7 +19,7 @@ pub enum ProfileError {
impl fmt::Display for ProfileError { impl fmt::Display for ProfileError {
// This trait requires `fmt` with this exact signature. // This trait requires `fmt` with this exact signature.
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self { match self {
ProfileError::Path(path, error) => write!(f, "Path {}: {}", path, error), ProfileError::Path(path, error) => write!(f, "Path {}: {}", path, error),
ProfileError::Read(path, error) => write!(f, "Read {}: {}", path, error), ProfileError::Read(path, error) => write!(f, "Read {}: {}", path, error),

View File

@@ -7,7 +7,7 @@ use crate::error::ProfileError;
use crate::FanCurvePU; use crate::FanCurvePU;
pub(crate) fn pwm_str(fan: char, index: usize) -> String { pub(crate) fn pwm_str(fan: char, index: usize) -> String {
let mut buf = "pwm1_auto_point1_pwm".to_string(); let mut buf = "pwm1_auto_point1_pwm".to_owned();
unsafe { unsafe {
let tmp = buf.as_bytes_mut(); let tmp = buf.as_bytes_mut();
tmp[3] = fan as u8; tmp[3] = fan as u8;
@@ -17,7 +17,7 @@ pub(crate) fn pwm_str(fan: char, index: usize) -> String {
} }
pub(crate) fn temp_str(fan: char, index: usize) -> String { pub(crate) fn temp_str(fan: char, index: usize) -> String {
let mut buf = "pwm1_auto_point1_temp".to_string(); let mut buf = "pwm1_auto_point1_temp".to_owned();
unsafe { unsafe {
let tmp = buf.as_bytes_mut(); let tmp = buf.as_bytes_mut();
tmp[3] = fan as u8; tmp[3] = fan as u8;
@@ -146,10 +146,10 @@ impl CurveData {
for attr in device.attributes() { for attr in device.attributes() {
let tmp = attr.name().to_string_lossy(); let tmp = attr.name().to_string_lossy();
if tmp.starts_with("pwm1") && tmp.ends_with("_temp") { if tmp.starts_with("pwm1") && tmp.ends_with("_temp") {
Self::set_val_from_attr(tmp.as_ref(), device, &mut self.temp) Self::set_val_from_attr(tmp.as_ref(), device, &mut self.temp);
} }
if tmp.starts_with("pwm1") && tmp.ends_with("_pwm") { if tmp.starts_with("pwm1") && tmp.ends_with("_pwm") {
Self::set_val_from_attr(tmp.as_ref(), device, &mut self.pwm) Self::set_val_from_attr(tmp.as_ref(), device, &mut self.pwm);
} }
} }
} }

View File

@@ -2,8 +2,8 @@ pub mod error;
pub mod fan_curve_set; pub mod fan_curve_set;
use std::fmt::Display; use std::fmt::Display;
use std::fs::OpenOptions; use std::fs::{self, OpenOptions};
use std::io::{Read, Write}; use std::io::Write;
use std::path::Path; use std::path::Path;
use error::ProfileError; use error::ProfileError;
@@ -49,18 +49,12 @@ impl Profile {
} }
pub fn get_active_profile() -> Result<Profile, ProfileError> { pub fn get_active_profile() -> Result<Profile, ProfileError> {
let mut file = OpenOptions::new().read(true).open(PLATFORM_PROFILE)?; let buf = fs::read_to_string(PLATFORM_PROFILE)?;
let mut buf = String::new();
file.read_to_string(&mut buf)?;
Ok(buf.as_str().into()) Ok(buf.as_str().into())
} }
pub fn get_profile_names() -> Result<Vec<Profile>, ProfileError> { pub fn get_profile_names() -> Result<Vec<Profile>, ProfileError> {
let mut file = OpenOptions::new().read(true).open(PLATFORM_PROFILES)?; let buf = fs::read_to_string(PLATFORM_PROFILES)?;
let mut buf = String::new();
file.read_to_string(&mut buf)?;
Ok(buf.rsplit(' ').map(|p| p.into()).collect()) Ok(buf.rsplit(' ').map(|p| p.into()).collect())
} }