From 88f7696dbde41bcdba8eec97b30f68a628af694b Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Fri, 13 Jun 2025 01:09:31 +0200 Subject: [PATCH 1/8] declare wrapper types with macro --- src/bitmap.rs | 16 +++------------- src/bitvec.rs | 16 +++------------- src/brightness_grid.rs | 16 +++------------- src/char_grid.rs | 14 +++----------- src/command.rs | 18 +++++------------- src/connection.rs | 2 +- src/cp437_grid.rs | 16 +++------------- src/lib.rs | 1 + src/macros.rs | 22 ++++++++++++++++++++++ 9 files changed, 44 insertions(+), 77 deletions(-) create mode 100644 src/macros.rs diff --git a/src/bitmap.rs b/src/bitmap.rs index f658b85..c07fa07 100644 --- a/src/bitmap.rs +++ b/src/bitmap.rs @@ -1,18 +1,8 @@ use servicepoint::{DataRef, Grid}; -use std::sync::{Arc, RwLock}; +use std::sync::{Arc}; +use crate::macros::wrap_uniffi_object; -#[derive(uniffi::Object)] -pub struct Bitmap { - pub(crate) actual: RwLock, -} - -impl Bitmap { - fn internal_new(actual: servicepoint::Bitmap) -> Arc { - Arc::new(Self { - actual: RwLock::new(actual), - }) - } -} +wrap_uniffi_object!(Bitmap); #[uniffi::export] impl Bitmap { diff --git a/src/bitvec.rs b/src/bitvec.rs index 778b7bc..e9356fd 100644 --- a/src/bitvec.rs +++ b/src/bitvec.rs @@ -1,17 +1,7 @@ -use std::sync::{Arc, RwLock}; +use std::sync::{Arc}; +use crate::macros::wrap_uniffi_object; -#[derive(uniffi::Object)] -pub struct BitVec { - pub(crate) actual: RwLock, -} - -impl BitVec { - fn internal_new(actual: servicepoint::DisplayBitVec) -> Arc { - Arc::new(Self { - actual: RwLock::new(actual), - }) - } -} +wrap_uniffi_object!(DisplayBitVec, BitVec); #[uniffi::export] impl BitVec { diff --git a/src/brightness_grid.rs b/src/brightness_grid.rs index ba84cb4..ca64ebf 100644 --- a/src/brightness_grid.rs +++ b/src/brightness_grid.rs @@ -1,18 +1,8 @@ use servicepoint::{Brightness, DataRef, Grid}; -use std::sync::{Arc, RwLock}; +use std::sync::{Arc}; +use crate::macros::wrap_uniffi_object; -#[derive(uniffi::Object)] -pub struct BrightnessGrid { - pub(crate) actual: RwLock, -} - -impl BrightnessGrid { - fn internal_new(actual: servicepoint::BrightnessGrid) -> Arc { - Arc::new(Self { - actual: RwLock::new(actual), - }) - } -} +wrap_uniffi_object!(BrightnessGrid); #[uniffi::export] impl BrightnessGrid { diff --git a/src/char_grid.rs b/src/char_grid.rs index e5d59a8..8bf70ac 100644 --- a/src/char_grid.rs +++ b/src/char_grid.rs @@ -1,12 +1,10 @@ use crate::cp437_grid::Cp437Grid; use servicepoint::{Grid, SetValueSeriesError}; use std::convert::Into; -use std::sync::{Arc, RwLock}; +use std::sync::{Arc}; +use crate::macros::wrap_uniffi_object; -#[derive(uniffi::Object)] -pub struct CharGrid { - pub(crate) actual: RwLock, -} +wrap_uniffi_object!(CharGrid); #[derive(uniffi::Error, thiserror::Error, Debug)] pub enum CharGridError { @@ -133,12 +131,6 @@ impl CharGrid { } impl CharGrid { - pub(crate) fn internal_new(actual: servicepoint::CharGrid) -> Arc { - Arc::new(Self { - actual: RwLock::new(actual), - }) - } - fn str_to_char(value: String) -> Result { if value.len() != 1 { return Err(CharGridError::StringNotOneChar { value }); diff --git a/src/command.rs b/src/command.rs index 710aeab..5939761 100644 --- a/src/command.rs +++ b/src/command.rs @@ -1,4 +1,3 @@ -use crate::bitmap::Bitmap; use crate::bitvec::BitVec; use crate::brightness_grid::BrightnessGrid; use crate::char_grid::CharGrid; @@ -7,17 +6,10 @@ use crate::cp437_grid::Cp437Grid; use crate::errors::ServicePointError; use servicepoint::{BitVecCommand, BrightnessGridCommand, CharGridCommand, ClearCommand, Cp437GridCommand, FadeOutCommand, GlobalBrightnessCommand, HardResetCommand, Origin}; use std::sync::Arc; +use crate::bitmap::Bitmap; +use crate::macros::wrap_uniffi_object; -#[derive(uniffi::Object)] -pub struct Command { - pub(crate) actual: servicepoint::TypedCommand, -} - -impl Command { - fn internal_new(actual: servicepoint::TypedCommand) -> Arc { - Arc::new(Command { actual }) - } -} +wrap_uniffi_object!(TypedCommand, Command); #[uniffi::export] impl Command { @@ -126,11 +118,11 @@ impl Command { #[uniffi::constructor] pub fn clone(other: &Arc) -> Arc { - Self::internal_new(other.actual.clone()) + Self::internal_new(other.actual.read().unwrap().clone()) } pub fn equals(&self, other: &Command) -> bool { - self.actual == other.actual + *self.actual.read().unwrap() == *other.actual.read().unwrap() } } diff --git a/src/connection.rs b/src/connection.rs index 9b0baea..32c9b8a 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -25,7 +25,7 @@ impl Connection { } pub fn send(&self, command: Arc) -> Result<(), ServicePointError> { - self.actual.send_command(command.actual.clone()).ok_or_else(|| { + self.actual.send_command(command.actual.read().unwrap().clone()).ok_or_else(|| { ServicePointError::IoError { error: "send failed".to_string(), } diff --git a/src/cp437_grid.rs b/src/cp437_grid.rs index 89f9420..7ca1e62 100644 --- a/src/cp437_grid.rs +++ b/src/cp437_grid.rs @@ -1,19 +1,9 @@ use crate::char_grid::CharGrid; use servicepoint::{DataRef, Grid}; -use std::sync::{Arc, RwLock}; +use std::sync::{Arc}; +use crate::macros::wrap_uniffi_object; -#[derive(uniffi::Object)] -pub struct Cp437Grid { - pub(crate) actual: RwLock, -} - -impl Cp437Grid { - pub(crate) fn internal_new(actual: servicepoint::Cp437Grid) -> Arc { - Arc::new(Self { - actual: RwLock::new(actual), - }) - } -} +wrap_uniffi_object!(Cp437Grid); #[uniffi::export] impl Cp437Grid { diff --git a/src/lib.rs b/src/lib.rs index 2ecad45..b981f9d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,3 +10,4 @@ mod connection; mod constants; mod cp437_grid; mod errors; +mod macros; diff --git a/src/macros.rs b/src/macros.rs new file mode 100644 index 0000000..8f46c1c --- /dev/null +++ b/src/macros.rs @@ -0,0 +1,22 @@ + +macro_rules! wrap_uniffi_object { + ($orig_t:ident, $new_t:ident) => { + #[derive(uniffi::Object)] + pub struct $new_t { + pub(crate) actual: std::sync::RwLock, + } + + impl $new_t { + pub(crate) fn internal_new(actual: servicepoint::$orig_t) -> Arc { + Arc::new(Self { + actual: std::sync::RwLock::new(actual), + }) + } + } + }; + ($t:ident) => { + wrap_uniffi_object!($t, $t); + }; +} + +pub(crate) use wrap_uniffi_object; \ No newline at end of file From fda2b9419d6d454f4f02678698689123cfc112b8 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Fri, 13 Jun 2025 01:13:51 +0200 Subject: [PATCH 2/8] add clone to macro --- src/bitmap.rs | 5 ----- src/bitvec.rs | 5 ----- src/brightness_grid.rs | 5 ----- src/char_grid.rs | 5 ----- src/command.rs | 5 ----- src/cp437_grid.rs | 5 ----- src/macros.rs | 8 ++++++++ 7 files changed, 8 insertions(+), 30 deletions(-) diff --git a/src/bitmap.rs b/src/bitmap.rs index c07fa07..aa2309c 100644 --- a/src/bitmap.rs +++ b/src/bitmap.rs @@ -28,11 +28,6 @@ impl Bitmap { ).unwrap()) } - #[uniffi::constructor] - pub fn clone(other: &Arc) -> Arc { - Self::internal_new(other.actual.read().unwrap().clone()) - } - pub fn set(&self, x: u64, y: u64, value: bool) { self.actual .write() diff --git a/src/bitvec.rs b/src/bitvec.rs index e9356fd..ef216f5 100644 --- a/src/bitvec.rs +++ b/src/bitvec.rs @@ -14,11 +14,6 @@ impl BitVec { Self::internal_new(servicepoint::DisplayBitVec::from_slice(&data)) } - #[uniffi::constructor] - pub fn clone(other: &Arc) -> Arc { - Self::internal_new(other.actual.read().unwrap().clone()) - } - pub fn set(&self, index: u64, value: bool) { self.actual.write().unwrap().set(index as usize, value) } diff --git a/src/brightness_grid.rs b/src/brightness_grid.rs index ca64ebf..956f139 100644 --- a/src/brightness_grid.rs +++ b/src/brightness_grid.rs @@ -23,11 +23,6 @@ impl BrightnessGrid { ).unwrap()) } - #[uniffi::constructor] - pub fn clone(other: &Arc) -> Arc { - Self::internal_new(other.actual.read().unwrap().clone()) - } - pub fn set(&self, x: u64, y: u64, value: u8) { self.actual.write().unwrap().set( x as usize, diff --git a/src/char_grid.rs b/src/char_grid.rs index 8bf70ac..1f39e1c 100644 --- a/src/char_grid.rs +++ b/src/char_grid.rs @@ -31,11 +31,6 @@ impl CharGrid { Self::internal_new(servicepoint::CharGrid::from(&*data)) } - #[uniffi::constructor] - pub fn clone(other: &Arc) -> Arc { - Self::internal_new(other.actual.read().unwrap().clone()) - } - pub fn set( &self, x: u64, diff --git a/src/command.rs b/src/command.rs index 5939761..aaf508c 100644 --- a/src/command.rs +++ b/src/command.rs @@ -116,11 +116,6 @@ impl Command { Self::internal_new(actual.into()) } - #[uniffi::constructor] - pub fn clone(other: &Arc) -> Arc { - Self::internal_new(other.actual.read().unwrap().clone()) - } - pub fn equals(&self, other: &Command) -> bool { *self.actual.read().unwrap() == *other.actual.read().unwrap() } diff --git a/src/cp437_grid.rs b/src/cp437_grid.rs index 7ca1e62..9db5d8e 100644 --- a/src/cp437_grid.rs +++ b/src/cp437_grid.rs @@ -24,11 +24,6 @@ impl Cp437Grid { ).unwrap()) } - #[uniffi::constructor] - pub fn clone(other: &Arc) -> Arc { - Self::internal_new(other.actual.read().unwrap().clone()) - } - pub fn set(&self, x: u64, y: u64, value: u8) { self.actual .write() diff --git a/src/macros.rs b/src/macros.rs index 8f46c1c..b22b12a 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -13,6 +13,14 @@ macro_rules! wrap_uniffi_object { }) } } + + #[uniffi::export] + impl $new_t { + #[uniffi::constructor] + pub fn clone(other: &Arc) -> Arc { + Self::internal_new(other.actual.read().unwrap().clone()) + } + } }; ($t:ident) => { wrap_uniffi_object!($t, $t); From 0b3f243ffa0f49e50e2b6e06b8c7962b543bf191 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Fri, 13 Jun 2025 01:27:57 +0200 Subject: [PATCH 3/8] add width and height macro --- src/bitmap.rs | 12 +++--------- src/brightness_grid.rs | 10 ++-------- src/char_grid.rs | 11 ++--------- src/cp437_grid.rs | 10 ++-------- src/macros.rs | 21 +++++++++++++++++++-- 5 files changed, 28 insertions(+), 36 deletions(-) diff --git a/src/bitmap.rs b/src/bitmap.rs index aa2309c..de094d2 100644 --- a/src/bitmap.rs +++ b/src/bitmap.rs @@ -1,8 +1,9 @@ use servicepoint::{DataRef, Grid}; use std::sync::{Arc}; -use crate::macros::wrap_uniffi_object; +use crate::macros::{wrap_width_height, wrap_uniffi_object}; wrap_uniffi_object!(Bitmap); +wrap_width_height!(Bitmap); #[uniffi::export] impl Bitmap { @@ -42,14 +43,7 @@ impl Bitmap { pub fn fill(&self, value: bool) { self.actual.write().unwrap().fill(value) } - pub fn width(&self) -> u64 { - self.actual.read().unwrap().width() as u64 - } - - pub fn height(&self) -> u64 { - self.actual.read().unwrap().height() as u64 - } - + pub fn equals(&self, other: &Bitmap) -> bool { let a = self.actual.read().unwrap(); let b = other.actual.read().unwrap(); diff --git a/src/brightness_grid.rs b/src/brightness_grid.rs index 956f139..04f6321 100644 --- a/src/brightness_grid.rs +++ b/src/brightness_grid.rs @@ -1,8 +1,9 @@ use servicepoint::{Brightness, DataRef, Grid}; use std::sync::{Arc}; -use crate::macros::wrap_uniffi_object; +use crate::macros::{wrap_width_height, wrap_uniffi_object}; wrap_uniffi_object!(BrightnessGrid); +wrap_width_height!(BrightnessGrid); #[uniffi::export] impl BrightnessGrid { @@ -45,13 +46,6 @@ impl BrightnessGrid { .unwrap() .fill(Brightness::saturating_from(value)) } - pub fn width(&self) -> u64 { - self.actual.read().unwrap().width() as u64 - } - - pub fn height(&self) -> u64 { - self.actual.read().unwrap().height() as u64 - } pub fn equals(&self, other: &BrightnessGrid) -> bool { let a = self.actual.read().unwrap(); diff --git a/src/char_grid.rs b/src/char_grid.rs index 1f39e1c..ff27cd1 100644 --- a/src/char_grid.rs +++ b/src/char_grid.rs @@ -2,9 +2,10 @@ use crate::cp437_grid::Cp437Grid; use servicepoint::{Grid, SetValueSeriesError}; use std::convert::Into; use std::sync::{Arc}; -use crate::macros::wrap_uniffi_object; +use crate::macros::{wrap_width_height, wrap_uniffi_object}; wrap_uniffi_object!(CharGrid); +wrap_width_height!(CharGrid); #[derive(uniffi::Error, thiserror::Error, Debug)] pub enum CharGridError { @@ -59,14 +60,6 @@ impl CharGrid { Ok(()) } - pub fn width(&self) -> u64 { - self.actual.read().unwrap().width() as u64 - } - - pub fn height(&self) -> u64 { - self.actual.read().unwrap().height() as u64 - } - pub fn equals(&self, other: &CharGrid) -> bool { let a = self.actual.read().unwrap(); let b = other.actual.read().unwrap(); diff --git a/src/cp437_grid.rs b/src/cp437_grid.rs index 9db5d8e..b7ba623 100644 --- a/src/cp437_grid.rs +++ b/src/cp437_grid.rs @@ -1,9 +1,10 @@ use crate::char_grid::CharGrid; use servicepoint::{DataRef, Grid}; use std::sync::{Arc}; -use crate::macros::wrap_uniffi_object; +use crate::macros::{wrap_width_height, wrap_uniffi_object}; wrap_uniffi_object!(Cp437Grid); +wrap_width_height!(Cp437Grid); #[uniffi::export] impl Cp437Grid { @@ -38,13 +39,6 @@ impl Cp437Grid { pub fn fill(&self, value: u8) { self.actual.write().unwrap().fill(value) } - pub fn width(&self) -> u64 { - self.actual.read().unwrap().width() as u64 - } - - pub fn height(&self) -> u64 { - self.actual.read().unwrap().height() as u64 - } pub fn equals(&self, other: &Cp437Grid) -> bool { let a = self.actual.read().unwrap(); diff --git a/src/macros.rs b/src/macros.rs index b22b12a..9a4de90 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -13,7 +13,7 @@ macro_rules! wrap_uniffi_object { }) } } - + #[uniffi::export] impl $new_t { #[uniffi::constructor] @@ -27,4 +27,21 @@ macro_rules! wrap_uniffi_object { }; } -pub(crate) use wrap_uniffi_object; \ No newline at end of file +pub(crate) use wrap_uniffi_object; + +macro_rules! wrap_width_height { + ($t:ident) => { + #[uniffi::export] + impl $t { + pub fn width(&self) -> u64 { + self.actual.read().unwrap().width() as u64 + } + + pub fn height(&self) -> u64 { + self.actual.read().unwrap().height() as u64 + } + } + }; +} + +pub(crate) use wrap_width_height; \ No newline at end of file From 7fe5ef07a8487cd03595c5b1b1c52d7ff4d35ac2 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Fri, 13 Jun 2025 09:52:07 +0200 Subject: [PATCH 4/8] add get set fill macro --- src/bitmap.rs | 38 ++++++++++++-------------------------- src/brightness.rs | 19 +++++++++++++++++++ src/brightness_grid.rs | 41 ++++++++++++----------------------------- src/cp437_grid.rs | 33 +++++++++++---------------------- src/lib.rs | 1 + src/macros.rs | 37 +++++++++++++++++++++++++++++++------ 6 files changed, 86 insertions(+), 83 deletions(-) create mode 100644 src/brightness.rs diff --git a/src/bitmap.rs b/src/bitmap.rs index de094d2..d030ea8 100644 --- a/src/bitmap.rs +++ b/src/bitmap.rs @@ -1,18 +1,20 @@ +use crate::macros::{ + wrap_get_set_fill_2d, wrap_uniffi_object, wrap_width_height, +}; use servicepoint::{DataRef, Grid}; -use std::sync::{Arc}; -use crate::macros::{wrap_width_height, wrap_uniffi_object}; +use std::sync::Arc; wrap_uniffi_object!(Bitmap); wrap_width_height!(Bitmap); +wrap_get_set_fill_2d!(Bitmap, bool); #[uniffi::export] impl Bitmap { #[uniffi::constructor] pub fn new(width: u64, height: u64) -> Arc { - Self::internal_new(servicepoint::Bitmap::new( - width as usize, - height as usize, - ).unwrap()) + Self::internal_new( + servicepoint::Bitmap::new(width as usize, height as usize).unwrap(), + ) } #[uniffi::constructor] @@ -22,28 +24,12 @@ impl Bitmap { #[uniffi::constructor] pub fn load(width: u64, height: u64, data: Vec) -> Arc { - Self::internal_new(servicepoint::Bitmap::load( - width as usize, - height as usize, - &data, - ).unwrap()) + Self::internal_new( + servicepoint::Bitmap::load(width as usize, height as usize, &data) + .unwrap(), + ) } - pub fn set(&self, x: u64, y: u64, value: bool) { - self.actual - .write() - .unwrap() - .set(x as usize, y as usize, value) - } - - pub fn get(&self, x: u64, y: u64) -> bool { - self.actual.read().unwrap().get(x as usize, y as usize) - } - - pub fn fill(&self, value: bool) { - self.actual.write().unwrap().fill(value) - } - pub fn equals(&self, other: &Bitmap) -> bool { let a = self.actual.read().unwrap(); let b = other.actual.read().unwrap(); diff --git a/src/brightness.rs b/src/brightness.rs new file mode 100644 index 0000000..0ea4591 --- /dev/null +++ b/src/brightness.rs @@ -0,0 +1,19 @@ +use crate::UniffiCustomTypeConverter; +use servicepoint::Brightness; + +uniffi::custom_type!(Brightness, u8); + +impl UniffiCustomTypeConverter for Brightness { + type Builtin = u8; + + fn into_custom(val: Self::Builtin) -> uniffi::Result + where + Self: Sized, + { + Ok(Brightness::saturating_from(val)) + } + + fn from_custom(obj: Self) -> Self::Builtin { + obj.into() + } +} diff --git a/src/brightness_grid.rs b/src/brightness_grid.rs index 04f6321..697a71f 100644 --- a/src/brightness_grid.rs +++ b/src/brightness_grid.rs @@ -1,9 +1,12 @@ +use crate::macros::{ + wrap_get_set_fill_2d, wrap_uniffi_object, wrap_width_height, +}; use servicepoint::{Brightness, DataRef, Grid}; -use std::sync::{Arc}; -use crate::macros::{wrap_width_height, wrap_uniffi_object}; +use std::sync::Arc; wrap_uniffi_object!(BrightnessGrid); wrap_width_height!(BrightnessGrid); +wrap_get_set_fill_2d!(BrightnessGrid, Brightness); #[uniffi::export] impl BrightnessGrid { @@ -17,36 +20,16 @@ impl BrightnessGrid { #[uniffi::constructor] pub fn load(width: u64, height: u64, data: Vec) -> Arc { - Self::internal_new(servicepoint::BrightnessGrid::saturating_load( - width as usize, - height as usize, - &data, - ).unwrap()) - } - - pub fn set(&self, x: u64, y: u64, value: u8) { - self.actual.write().unwrap().set( - x as usize, - y as usize, - Brightness::saturating_from(value), + Self::internal_new( + servicepoint::BrightnessGrid::saturating_load( + width as usize, + height as usize, + &data, + ) + .unwrap(), ) } - pub fn get(&self, x: u64, y: u64) -> u8 { - self.actual - .read() - .unwrap() - .get(x as usize, y as usize) - .into() - } - - pub fn fill(&self, value: u8) { - self.actual - .write() - .unwrap() - .fill(Brightness::saturating_from(value)) - } - pub fn equals(&self, other: &BrightnessGrid) -> bool { let a = self.actual.read().unwrap(); let b = other.actual.read().unwrap(); diff --git a/src/cp437_grid.rs b/src/cp437_grid.rs index b7ba623..eeeb8b6 100644 --- a/src/cp437_grid.rs +++ b/src/cp437_grid.rs @@ -1,10 +1,11 @@ use crate::char_grid::CharGrid; +use crate::macros::{wrap_get_set_fill_2d, wrap_uniffi_object, wrap_width_height}; use servicepoint::{DataRef, Grid}; -use std::sync::{Arc}; -use crate::macros::{wrap_width_height, wrap_uniffi_object}; +use std::sync::Arc; wrap_uniffi_object!(Cp437Grid); wrap_width_height!(Cp437Grid); +wrap_get_set_fill_2d!(Cp437Grid, u8); #[uniffi::export] impl Cp437Grid { @@ -18,26 +19,14 @@ impl Cp437Grid { #[uniffi::constructor] pub fn load(width: u64, height: u64, data: Vec) -> Arc { - Self::internal_new(servicepoint::Cp437Grid::load( - width as usize, - height as usize, - &data, - ).unwrap()) - } - - pub fn set(&self, x: u64, y: u64, value: u8) { - self.actual - .write() - .unwrap() - .set(x as usize, y as usize, value) - } - - pub fn get(&self, x: u64, y: u64) -> u8 { - self.actual.read().unwrap().get(x as usize, y as usize) - } - - pub fn fill(&self, value: u8) { - self.actual.write().unwrap().fill(value) + Self::internal_new( + servicepoint::Cp437Grid::load( + width as usize, + height as usize, + &data, + ) + .unwrap(), + ) } pub fn equals(&self, other: &Cp437Grid) -> bool { diff --git a/src/lib.rs b/src/lib.rs index b981f9d..c116ccb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ uniffi::setup_scaffolding!(); mod bitmap; mod bitvec; +mod brightness; mod brightness_grid; mod char_grid; mod command; diff --git a/src/macros.rs b/src/macros.rs index 9a4de90..799a95f 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1,13 +1,14 @@ - macro_rules! wrap_uniffi_object { - ($orig_t:ident, $new_t:ident) => { + ($orig_t:ident, $new_t:ident) => { #[derive(uniffi::Object)] pub struct $new_t { pub(crate) actual: std::sync::RwLock, } impl $new_t { - pub(crate) fn internal_new(actual: servicepoint::$orig_t) -> Arc { + pub(crate) fn internal_new( + actual: servicepoint::$orig_t, + ) -> Arc { Arc::new(Self { actual: std::sync::RwLock::new(actual), }) @@ -21,7 +22,7 @@ macro_rules! wrap_uniffi_object { Self::internal_new(other.actual.read().unwrap().clone()) } } - }; + }; ($t:ident) => { wrap_uniffi_object!($t, $t); }; @@ -36,7 +37,7 @@ macro_rules! wrap_width_height { pub fn width(&self) -> u64 { self.actual.read().unwrap().width() as u64 } - + pub fn height(&self) -> u64 { self.actual.read().unwrap().height() as u64 } @@ -44,4 +45,28 @@ macro_rules! wrap_width_height { }; } -pub(crate) use wrap_width_height; \ No newline at end of file +pub(crate) use wrap_width_height; + +macro_rules! wrap_get_set_fill_2d { + ($t:ident, $contained:ident) => { + #[uniffi::export] + impl $t { + pub fn set(&self, x: u64, y: u64, value: $contained) { + self.actual + .write() + .unwrap() + .set(x as usize, y as usize, value) + } + + pub fn get(&self, x: u64, y: u64) -> $contained { + self.actual.read().unwrap().get(x as usize, y as usize) + } + + pub fn fill(&self, value: $contained) { + self.actual.write().unwrap().fill(value) + } + } + }; +} + +pub(crate) use wrap_get_set_fill_2d; From 8f030109446cdb7c1f389f30bd255cce449f5f63 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Fri, 13 Jun 2025 10:17:59 +0200 Subject: [PATCH 5/8] update servicepoint, simplify copy_raw --- Cargo.lock | 8 ++++---- Cargo.toml | 4 ++-- src/bitmap.rs | 4 ++-- src/brightness_grid.rs | 13 +++++-------- src/cp437_grid.rs | 8 +++++--- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 930a6a9..486957e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "adler2" @@ -425,9 +425,9 @@ dependencies = [ [[package]] name = "servicepoint" -version = "0.14.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6bd5cfa49c73aeecb344680ffbf697abf73e0563a441b93b9723ae43867500f" +checksum = "91a33bff7f9db5008748b23ca0c906c276fe00694390b681f004a55968a42cfe" dependencies = [ "bitvec", "bzip2", @@ -441,7 +441,7 @@ dependencies = [ [[package]] name = "servicepoint_binding_uniffi" -version = "0.13.1" +version = "0.15.0" dependencies = [ "servicepoint", "thiserror 2.0.11", diff --git a/Cargo.toml b/Cargo.toml index c9f07fd..d6d0c18 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "servicepoint_binding_uniffi" -version = "0.13.1" +version = "0.15.0" publish = false edition = "2021" license = "GPL-3.0-or-later" @@ -21,7 +21,7 @@ uniffi = { version = "0.28.3" } thiserror = "2.0" [dependencies.servicepoint] -version = "0.14.1" +version = "0.15.0" features = ["all_compressions"] [package.metadata.docs.rs] diff --git a/src/bitmap.rs b/src/bitmap.rs index d030ea8..6c2f198 100644 --- a/src/bitmap.rs +++ b/src/bitmap.rs @@ -2,7 +2,7 @@ use crate::macros::{ wrap_get_set_fill_2d, wrap_uniffi_object, wrap_width_height, }; use servicepoint::{DataRef, Grid}; -use std::sync::Arc; +use std::{ops::Deref, sync::Arc}; wrap_uniffi_object!(Bitmap); wrap_width_height!(Bitmap); @@ -37,6 +37,6 @@ impl Bitmap { } pub fn copy_raw(&self) -> Vec { - self.actual.read().unwrap().data_ref().to_vec() + self.actual.read().unwrap().deref().into() } } diff --git a/src/brightness_grid.rs b/src/brightness_grid.rs index 697a71f..8cff1f8 100644 --- a/src/brightness_grid.rs +++ b/src/brightness_grid.rs @@ -2,7 +2,10 @@ use crate::macros::{ wrap_get_set_fill_2d, wrap_uniffi_object, wrap_width_height, }; use servicepoint::{Brightness, DataRef, Grid}; -use std::sync::Arc; +use std::{ + ops::Deref, + sync::{Arc, RwLockReadGuard}, +}; wrap_uniffi_object!(BrightnessGrid); wrap_width_height!(BrightnessGrid); @@ -37,12 +40,6 @@ impl BrightnessGrid { } pub fn copy_raw(&self) -> Vec { - self.actual - .read() - .unwrap() - .data_ref() - .iter() - .map(u8::from) - .collect() + self.actual.read().unwrap().deref().into() } } diff --git a/src/cp437_grid.rs b/src/cp437_grid.rs index eeeb8b6..9636b24 100644 --- a/src/cp437_grid.rs +++ b/src/cp437_grid.rs @@ -1,7 +1,9 @@ use crate::char_grid::CharGrid; -use crate::macros::{wrap_get_set_fill_2d, wrap_uniffi_object, wrap_width_height}; +use crate::macros::{ + wrap_get_set_fill_2d, wrap_uniffi_object, wrap_width_height, +}; use servicepoint::{DataRef, Grid}; -use std::sync::Arc; +use std::{ops::Deref, sync::Arc}; wrap_uniffi_object!(Cp437Grid); wrap_width_height!(Cp437Grid); @@ -36,7 +38,7 @@ impl Cp437Grid { } pub fn copy_raw(&self) -> Vec { - self.actual.read().unwrap().data_ref().to_vec() + self.actual.read().unwrap().deref().into() } pub fn to_utf8(&self) -> Arc { From 27d71cefe621443deda9c62ad3b66bf90222a3eb Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Fri, 13 Jun 2025 10:47:31 +0200 Subject: [PATCH 6/8] update to nixos 25.05 --- flake.lock | 8 ++++---- flake.nix | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 9e70e85..f51971e 100644 --- a/flake.lock +++ b/flake.lock @@ -2,16 +2,16 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1739357830, - "narHash": "sha256-9xim3nJJUFbVbJCz48UP4fGRStVW5nv4VdbimbKxJ3I=", + "lastModified": 1749494155, + "narHash": "sha256-FG4DEYBpROupu758beabUk9lhrblSf5hnv84v1TLqMc=", "owner": "nixos", "repo": "nixpkgs", - "rev": "0ff09db9d034a04acd4e8908820ba0b410d7a33a", + "rev": "88331c17ba434359491e8d5889cce872464052c2", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-24.11", + "ref": "nixos-25.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index f619fe0..60cfbb6 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Flake for the servicepoint library."; inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; }; outputs = From cee4937270a1f1906d30d653c8f4b235b2fbf0b0 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Fri, 13 Jun 2025 11:45:11 +0200 Subject: [PATCH 7/8] move containers to module --- src/command.rs | 23 ++++++++++++++--------- src/{ => containers}/bitmap.rs | 6 ++---- src/{ => containers}/bitvec.rs | 7 +++++-- src/{ => containers}/brightness_grid.rs | 11 +++-------- src/{ => containers}/char_grid.rs | 6 ++---- src/{ => containers}/cp437_grid.rs | 7 ++----- src/containers/mod.rs | 5 +++++ src/lib.rs | 7 ++----- 8 files changed, 35 insertions(+), 37 deletions(-) rename src/{ => containers}/bitmap.rs (89%) rename src/{ => containers}/bitvec.rs (88%) rename src/{ => containers}/brightness_grid.rs (83%) rename src/{ => containers}/char_grid.rs (96%) rename src/{ => containers}/cp437_grid.rs (87%) create mode 100644 src/containers/mod.rs diff --git a/src/command.rs b/src/command.rs index aaf508c..bc59001 100644 --- a/src/command.rs +++ b/src/command.rs @@ -1,13 +1,18 @@ -use crate::bitvec::BitVec; -use crate::brightness_grid::BrightnessGrid; -use crate::char_grid::CharGrid; -use crate::compression_code::CompressionCode; -use crate::cp437_grid::Cp437Grid; -use crate::errors::ServicePointError; -use servicepoint::{BitVecCommand, BrightnessGridCommand, CharGridCommand, ClearCommand, Cp437GridCommand, FadeOutCommand, GlobalBrightnessCommand, HardResetCommand, Origin}; +use crate::{ + compression_code::CompressionCode, + containers::{ + bitmap::Bitmap, bitvec::BitVec, brightness_grid::BrightnessGrid, + char_grid::CharGrid, cp437_grid::Cp437Grid, + }, + errors::ServicePointError, + macros::wrap_uniffi_object, +}; +use servicepoint::{ + BitVecCommand, BrightnessGridCommand, CharGridCommand, ClearCommand, + Cp437GridCommand, FadeOutCommand, GlobalBrightnessCommand, + HardResetCommand, Origin, +}; use std::sync::Arc; -use crate::bitmap::Bitmap; -use crate::macros::wrap_uniffi_object; wrap_uniffi_object!(TypedCommand, Command); diff --git a/src/bitmap.rs b/src/containers/bitmap.rs similarity index 89% rename from src/bitmap.rs rename to src/containers/bitmap.rs index 6c2f198..01b99a4 100644 --- a/src/bitmap.rs +++ b/src/containers/bitmap.rs @@ -1,7 +1,5 @@ -use crate::macros::{ - wrap_get_set_fill_2d, wrap_uniffi_object, wrap_width_height, -}; -use servicepoint::{DataRef, Grid}; +use crate::macros::*; +use servicepoint::Grid; use std::{ops::Deref, sync::Arc}; wrap_uniffi_object!(Bitmap); diff --git a/src/bitvec.rs b/src/containers/bitvec.rs similarity index 88% rename from src/bitvec.rs rename to src/containers/bitvec.rs index ef216f5..17df9fd 100644 --- a/src/bitvec.rs +++ b/src/containers/bitvec.rs @@ -1,5 +1,5 @@ -use std::sync::{Arc}; use crate::macros::wrap_uniffi_object; +use std::sync::Arc; wrap_uniffi_object!(DisplayBitVec, BitVec); @@ -7,7 +7,10 @@ wrap_uniffi_object!(DisplayBitVec, BitVec); impl BitVec { #[uniffi::constructor] pub fn new(size: u64) -> Arc { - Self::internal_new(servicepoint::DisplayBitVec::repeat(false, size as usize)) + Self::internal_new(servicepoint::DisplayBitVec::repeat( + false, + size as usize, + )) } #[uniffi::constructor] pub fn load(data: Vec) -> Arc { diff --git a/src/brightness_grid.rs b/src/containers/brightness_grid.rs similarity index 83% rename from src/brightness_grid.rs rename to src/containers/brightness_grid.rs index 8cff1f8..dcfaa47 100644 --- a/src/brightness_grid.rs +++ b/src/containers/brightness_grid.rs @@ -1,11 +1,6 @@ -use crate::macros::{ - wrap_get_set_fill_2d, wrap_uniffi_object, wrap_width_height, -}; -use servicepoint::{Brightness, DataRef, Grid}; -use std::{ - ops::Deref, - sync::{Arc, RwLockReadGuard}, -}; +use crate::macros::*; +use servicepoint::{Brightness, Grid}; +use std::{ops::Deref, sync::Arc}; wrap_uniffi_object!(BrightnessGrid); wrap_width_height!(BrightnessGrid); diff --git a/src/char_grid.rs b/src/containers/char_grid.rs similarity index 96% rename from src/char_grid.rs rename to src/containers/char_grid.rs index ff27cd1..4300172 100644 --- a/src/char_grid.rs +++ b/src/containers/char_grid.rs @@ -1,8 +1,6 @@ -use crate::cp437_grid::Cp437Grid; +use crate::{containers::cp437_grid::Cp437Grid, macros::*}; use servicepoint::{Grid, SetValueSeriesError}; -use std::convert::Into; -use std::sync::{Arc}; -use crate::macros::{wrap_width_height, wrap_uniffi_object}; +use std::{convert::Into, sync::Arc}; wrap_uniffi_object!(CharGrid); wrap_width_height!(CharGrid); diff --git a/src/cp437_grid.rs b/src/containers/cp437_grid.rs similarity index 87% rename from src/cp437_grid.rs rename to src/containers/cp437_grid.rs index 9636b24..bf42122 100644 --- a/src/cp437_grid.rs +++ b/src/containers/cp437_grid.rs @@ -1,8 +1,5 @@ -use crate::char_grid::CharGrid; -use crate::macros::{ - wrap_get_set_fill_2d, wrap_uniffi_object, wrap_width_height, -}; -use servicepoint::{DataRef, Grid}; +use crate::{containers::char_grid::CharGrid, macros::*}; +use servicepoint::Grid; use std::{ops::Deref, sync::Arc}; wrap_uniffi_object!(Cp437Grid); diff --git a/src/containers/mod.rs b/src/containers/mod.rs new file mode 100644 index 0000000..7dce8bd --- /dev/null +++ b/src/containers/mod.rs @@ -0,0 +1,5 @@ +pub mod bitmap; +pub mod bitvec; +pub mod brightness_grid; +pub mod char_grid; +pub mod cp437_grid; diff --git a/src/lib.rs b/src/lib.rs index c116ccb..f491dbe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1,11 @@ uniffi::setup_scaffolding!(); -mod bitmap; -mod bitvec; mod brightness; -mod brightness_grid; -mod char_grid; mod command; +mod commands; mod compression_code; mod connection; mod constants; -mod cp437_grid; +mod containers; mod errors; mod macros; From 635fef024437d29b922999fe1d8bd7e6e30524a9 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Fri, 13 Jun 2025 11:47:23 +0200 Subject: [PATCH 8/8] move command to module, first separate types --- src/commands/cc_only.rs | 23 +++++++++++++++++++++++ src/{ => commands}/command.rs | 24 +++++++++++++++--------- src/commands/mod.rs | 3 +++ src/connection.rs | 18 ++++++------------ src/lib.rs | 1 - 5 files changed, 47 insertions(+), 22 deletions(-) create mode 100644 src/commands/cc_only.rs rename src/{ => commands}/command.rs (89%) create mode 100644 src/commands/mod.rs diff --git a/src/commands/cc_only.rs b/src/commands/cc_only.rs new file mode 100644 index 0000000..634e7d0 --- /dev/null +++ b/src/commands/cc_only.rs @@ -0,0 +1,23 @@ +use std::sync::Arc; + +macro_rules! command_code_only_command { + ($command_struct:ident) => { + #[derive(uniffi::Object)] + pub struct $command_struct; + + #[uniffi::export] + impl $command_struct { + #[uniffi::constructor] + pub fn new() -> Arc { + const _: () = + assert!(size_of::() == 0); + Arc::new($command_struct) + } + } + }; +} + +command_code_only_command!(ClearCommand); +command_code_only_command!(HardResetCommand); +command_code_only_command!(BitmapLegacyCommand); +command_code_only_command!(FadeOutCommand); diff --git a/src/command.rs b/src/commands/command.rs similarity index 89% rename from src/command.rs rename to src/commands/command.rs index bc59001..9041b33 100644 --- a/src/command.rs +++ b/src/commands/command.rs @@ -27,7 +27,7 @@ impl Command { pub fn brightness(brightness: u8) -> Result, ServicePointError> { servicepoint::Brightness::try_from(brightness) .map_err(move |value| ServicePointError::InvalidBrightness { - value + value, }) .map(GlobalBrightnessCommand::from) .map(servicepoint::TypedCommand::Brightness) @@ -56,8 +56,10 @@ impl Command { let actual = servicepoint::BitmapCommand { origin, bitmap, - compression: servicepoint::CompressionCode::try_from(compression as u16) - .unwrap(), + compression: servicepoint::CompressionCode::try_from( + compression as u16, + ) + .unwrap(), }; Self::internal_new(actual.into()) } @@ -70,7 +72,7 @@ impl Command { ) -> Arc { let origin = Origin::new(offset_x as usize, offset_y as usize); let grid = grid.actual.read().unwrap().clone(); - let actual = BrightnessGridCommand {origin, grid}; + let actual = BrightnessGridCommand { origin, grid }; Self::internal_new(actual.into()) } @@ -85,14 +87,18 @@ impl Command { let actual = BitVecCommand { offset: offset as usize, bitvec, - compression: servicepoint::CompressionCode::try_from(compression as u16) + compression: servicepoint::CompressionCode::try_from( + compression as u16, + ) .unwrap(), operation: match operation { - BinaryOperation::Overwrite => servicepoint::BinaryOperation::Overwrite, + BinaryOperation::Overwrite => { + servicepoint::BinaryOperation::Overwrite + } BinaryOperation::And => servicepoint::BinaryOperation::And, BinaryOperation::Or => servicepoint::BinaryOperation::Or, BinaryOperation::Xor => servicepoint::BinaryOperation::Xor, - } + }, }; Self::internal_new(actual.into()) } @@ -105,7 +111,7 @@ impl Command { ) -> Arc { let origin = Origin::new(offset_x as usize, offset_y as usize); let grid = grid.actual.read().unwrap().clone(); - let actual = Cp437GridCommand {origin, grid}; + let actual = Cp437GridCommand { origin, grid }; Self::internal_new(actual.into()) } @@ -117,7 +123,7 @@ impl Command { ) -> Arc { let origin = Origin::new(offset_x as usize, offset_y as usize); let grid = grid.actual.read().unwrap().clone(); - let actual = CharGridCommand {origin, grid}; + let actual = CharGridCommand { origin, grid }; Self::internal_new(actual.into()) } diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..4be7e73 --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1,3 @@ +pub mod command; + +pub mod cc_only; diff --git a/src/connection.rs b/src/connection.rs index 32c9b8a..1e6a63b 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -1,12 +1,6 @@ -use std::{ - net::UdpSocket, - sync::Arc -}; +use crate::{commands::command::Command, errors::ServicePointError}; use servicepoint::UdpSocketExt; -use crate::{ - command::Command, - errors::ServicePointError -}; +use std::{net::UdpSocket, sync::Arc}; #[derive(uniffi::Object)] pub struct Connection { @@ -25,10 +19,10 @@ impl Connection { } pub fn send(&self, command: Arc) -> Result<(), ServicePointError> { - self.actual.send_command(command.actual.read().unwrap().clone()).ok_or_else(|| { - ServicePointError::IoError { + self.actual + .send_command(command.actual.read().unwrap().clone()) + .ok_or_else(|| ServicePointError::IoError { error: "send failed".to_string(), - } - }) + }) } } diff --git a/src/lib.rs b/src/lib.rs index f491dbe..c7addef 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,6 @@ uniffi::setup_scaffolding!(); mod brightness; -mod command; mod commands; mod compression_code; mod connection;