diff --git a/src/commands/bitmap_command.rs b/src/commands/bitmap_command.rs index 2cb86f0..d325bce 100644 --- a/src/commands/bitmap_command.rs +++ b/src/commands/bitmap_command.rs @@ -1,15 +1,10 @@ -use crate::{ - commands::{wrap_command, wrap_origin_accessors}, - macros::wrap, -}; +use crate::macros::wrap; use servicepoint::{Bitmap, BitmapCommand, CompressionCode, Origin}; use std::ptr::NonNull; -wrap_command!(Bitmap); -wrap_origin_accessors!(BitmapCommand); - wrap! { BitmapCommand { + derives: crate::commands::derive_command[Bitmap], crate::commands::derive_origin_accessors; properties: prop bitmap: Bitmap { get mut; set move; }; prop compression: CompressionCode { get; set; }; diff --git a/src/commands/bitvec_command.rs b/src/commands/bitvec_command.rs index 3b239aa..82b92fb 100644 --- a/src/commands/bitvec_command.rs +++ b/src/commands/bitvec_command.rs @@ -1,13 +1,12 @@ -use crate::{commands::wrap_command, macros::wrap}; +use crate::macros::wrap; use servicepoint::{ BinaryOperation, BitVecCommand, CompressionCode, DisplayBitVec, Offset, }; use std::ptr::NonNull; -wrap_command!(BitVec); - wrap!( BitVecCommand { + derives: crate::commands::derive_command[BitVec]; properties: prop bitvec: DisplayBitVec { get mut; set move; }; prop offset: Offset { get; set; }; diff --git a/src/commands/brightness_grid_command.rs b/src/commands/brightness_grid_command.rs index cbf22bb..ef568bd 100644 --- a/src/commands/brightness_grid_command.rs +++ b/src/commands/brightness_grid_command.rs @@ -1,15 +1,10 @@ -use crate::{ - commands::{wrap_command, wrap_origin_accessors}, - macros::wrap, -}; +use crate::macros::wrap; use servicepoint::{BrightnessGrid, BrightnessGridCommand, Origin}; use std::ptr::NonNull; -wrap_command!(BrightnessGrid); -wrap_origin_accessors!(BrightnessGridCommand); - wrap!( BrightnessGridCommand { + derives: crate::commands::derive_command[BrightnessGrid], crate::commands::derive_origin_accessors; properties: prop grid: BrightnessGrid { get mut; set move; }; functions: diff --git a/src/commands/cc_only_commands.rs b/src/commands/cc_only_commands.rs index 3fa97c7..22a4a3b 100644 --- a/src/commands/cc_only_commands.rs +++ b/src/commands/cc_only_commands.rs @@ -1,13 +1,11 @@ -use crate::commands::wrap_command; use servicepoint::{ClearCommand, FadeOutCommand, HardResetCommand}; macro_rules! wrap_cc_only { ($(#[$meta:meta])* $command:ident) => { ::paste::paste!{ - wrap_command!($command); - $crate::macros::wrap!{ [< $command Command >] { + derives: $crate::commands::derive_command[$command]; functions: $(#[$meta])* /// diff --git a/src/commands/char_grid_command.rs b/src/commands/char_grid_command.rs index cbb91e6..96d8b90 100644 --- a/src/commands/char_grid_command.rs +++ b/src/commands/char_grid_command.rs @@ -1,15 +1,10 @@ -use crate::{ - commands::{wrap_command, wrap_origin_accessors}, - macros::wrap, -}; +use crate::macros::wrap; use servicepoint::{CharGrid, CharGridCommand, Origin}; use std::ptr::NonNull; -wrap_command!(CharGrid); -wrap_origin_accessors!(CharGridCommand); - wrap!( CharGridCommand { + derives: crate::commands::derive_command[CharGrid], crate::commands::derive_origin_accessors; properties: prop grid: CharGrid { get mut; set move; }; functions: diff --git a/src/commands/cp437_grid_command.rs b/src/commands/cp437_grid_command.rs index 8eeeb8e..19b35f6 100644 --- a/src/commands/cp437_grid_command.rs +++ b/src/commands/cp437_grid_command.rs @@ -1,15 +1,10 @@ -use crate::{ - commands::{wrap_command, wrap_origin_accessors}, - macros::wrap, -}; +use crate::macros::wrap; use servicepoint::{Cp437Grid, Cp437GridCommand, Origin}; use std::ptr::NonNull; -wrap_command!(Cp437Grid); -wrap_origin_accessors!(Cp437GridCommand); - wrap!( Cp437GridCommand { + derives: crate::commands::derive_command[Cp437Grid], crate::commands::derive_origin_accessors; properties: prop grid: Cp437Grid { get mut; set move; }; functions: diff --git a/src/commands/global_brightness_command.rs b/src/commands/global_brightness_command.rs index 8e988c1..1ab9a1b 100644 --- a/src/commands/global_brightness_command.rs +++ b/src/commands/global_brightness_command.rs @@ -1,11 +1,10 @@ -use crate::{commands::wrap_command, macros::wrap}; +use crate::macros::wrap; use servicepoint::{Brightness, GlobalBrightnessCommand}; use std::ptr::NonNull; -wrap_command!(GlobalBrightness); - wrap!( GlobalBrightnessCommand { + derives: crate::commands::derive_command[GlobalBrightness]; properties: prop brightness: Brightness { get; set; }; functions: diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 1d6e8ff..e3e3715 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -14,8 +14,8 @@ pub use char_grid_command::*; pub use cp437_grid_command::*; pub use generic_command::*; -macro_rules! wrap_origin_accessors { - ( $object_type:ident ) => { +macro_rules! derive_origin_accessors { + ($object_type:ident) => { ::paste::paste! { $crate::macros::wrap_methods!($object_type; #[doc = " Reads the origin field of the [`" $object_type "`]."] @@ -70,21 +70,16 @@ macro_rules! derive_command_into_packet { } } -macro_rules! wrap_command { - ($command:ident, $object_type:ident) => { +macro_rules! derive_command { + ($object_type:ident, $command:ident) => { $crate::macros::derive_clone!($object_type); $crate::macros::derive_free!($object_type); $crate::commands::derive_command_from!($command); $crate::commands::derive_command_into_packet!($object_type); }; - ($command:ident) => { - ::paste::paste! { - $crate::commands::wrap_command!($command, [< $command Command >]); - } - }; } pub(crate) use { - derive_command_from, derive_command_into_packet, wrap_command, - wrap_origin_accessors, + derive_command, derive_command_from, derive_command_into_packet, + derive_origin_accessors, }; diff --git a/src/containers/bitmap.rs b/src/containers/bitmap.rs index 4de29db..5974016 100644 --- a/src/containers/bitmap.rs +++ b/src/containers/bitmap.rs @@ -1,17 +1,13 @@ -use crate::{ - containers::{wrap_grid, ByteSlice}, - macros::wrap, -}; +use crate::{containers::ByteSlice, macros::wrap}; use servicepoint::{ Bitmap, BitmapCommand, CompressionCode, DataRef, DisplayBitVec, Grid, Origin, Packet, }; use std::ptr::NonNull; -wrap_grid!(Bitmap, bool); - wrap! { Bitmap { + derives: crate::containers::derive_container, crate::containers::derive_grid[bool]; functions: /// Creates a new [Bitmap] with the specified dimensions. /// diff --git a/src/containers/bitvec.rs b/src/containers/bitvec.rs index 369501b..57e4fd8 100644 --- a/src/containers/bitvec.rs +++ b/src/containers/bitvec.rs @@ -1,16 +1,12 @@ -use crate::{ - containers::{wrap_container, ByteSlice}, - macros::wrap, -}; +use crate::{containers::ByteSlice, macros::wrap}; use servicepoint::{ BinaryOperation, BitVecCommand, CompressionCode, DisplayBitVec, Packet, }; use std::ptr::NonNull; -wrap_container!(DisplayBitVec); - wrap! { DisplayBitVec { + derives: crate::containers::derive_container; functions: /// Creates a new [DisplayBitVec] instance. /// diff --git a/src/containers/brightness_grid.rs b/src/containers/brightness_grid.rs index 8c74b25..3b3fabb 100644 --- a/src/containers/brightness_grid.rs +++ b/src/containers/brightness_grid.rs @@ -1,17 +1,13 @@ -use crate::{ - containers::{wrap_grid, ByteSlice}, - macros::wrap, -}; +use crate::{containers::ByteSlice, macros::wrap}; use servicepoint::{ Brightness, BrightnessGrid, BrightnessGridCommand, ByteGrid, DataRef, Grid, Origin, Packet, }; use std::{mem::transmute, ptr::NonNull}; -wrap_grid!(BrightnessGrid, Brightness); - wrap! { BrightnessGrid { + derives: crate::containers::derive_container, crate::containers::derive_grid[Brightness]; functions: /// Creates a new [BrightnessGrid] with the specified dimensions. /// diff --git a/src/containers/char_grid.rs b/src/containers/char_grid.rs index 4423071..8946b50 100644 --- a/src/containers/char_grid.rs +++ b/src/containers/char_grid.rs @@ -1,15 +1,10 @@ -use crate::{ - containers::{derive_get_width_height, wrap_container, ByteSlice}, - macros::wrap, -}; +use crate::{containers::ByteSlice, macros::wrap}; use servicepoint::{CharGrid, CharGridCommand, Grid, Origin, Packet}; use std::ptr::NonNull; -wrap_container!(CharGrid); -derive_get_width_height!(CharGrid); - wrap! { CharGrid { + derives: crate::containers::derive_container, crate::containers::derive_get_width_height; functions: /// Creates a new [CharGrid] with the specified dimensions. /// diff --git a/src/containers/cp437_grid.rs b/src/containers/cp437_grid.rs index a6dbeea..b67d1ae 100644 --- a/src/containers/cp437_grid.rs +++ b/src/containers/cp437_grid.rs @@ -1,16 +1,12 @@ -use crate::{ - containers::{wrap_grid, ByteSlice}, - macros::wrap, -}; +use crate::{containers::ByteSlice, macros::wrap}; use servicepoint::{ Cp437Grid, Cp437GridCommand, DataRef, Grid, Origin, Packet, }; use std::ptr::NonNull; -wrap_grid!(Cp437Grid, u8); - wrap! { Cp437Grid { + derives: crate::containers::derive_container, crate::containers::derive_grid[u8]; functions: /// Creates a new [Cp437Grid] with the specified dimensions. /// diff --git a/src/containers/mod.rs b/src/containers/mod.rs index 608d038..5e0b48d 100644 --- a/src/containers/mod.rs +++ b/src/containers/mod.rs @@ -12,7 +12,7 @@ pub use byte_slice::*; pub use char_grid::*; pub use cp437_grid::*; -macro_rules! wrap_container { +macro_rules! derive_container { ($object_type:ident) => { $crate::macros::derive_clone!($object_type); $crate::macros::derive_free!($object_type); @@ -31,9 +31,8 @@ macro_rules! derive_get_width_height { }; } -macro_rules! wrap_grid { +macro_rules! derive_grid { ($object_type:ident, $value_type:ident) => { - $crate::containers::wrap_container!($object_type); $crate::containers::derive_get_width_height!($object_type); $crate::macros::wrap_methods! {$object_type; /// Gets the current value at the specified position. @@ -69,7 +68,7 @@ macro_rules! wrap_grid { }; } -pub(crate) use {derive_get_width_height, wrap_container, wrap_grid}; +pub(crate) use {derive_container, derive_get_width_height, derive_grid}; mod _hidden { /// This is a type only used by cbindgen to have a type for pointers. diff --git a/src/macros.rs b/src/macros.rs index 4149873..bbc9ef8 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -266,6 +266,12 @@ macro_rules! wrap_functions { macro_rules! wrap { ( $object_type:ident { + $( + derives: + $( + $derive:path $( [ $( $derive_arg:ident ),+ ] )? + ),+; + )? $( properties: $( @@ -292,6 +298,9 @@ macro_rules! wrap { )? } ) => { + $($( + $derive!($object_type $(, $($derive_arg),+)?); + )+)? $($( $crate::macros::wrap_fields!($object_type; prop $prop_name : $prop_type { $($accessor $($modifier)?;)+ };