1use super::ObjectQuery;
2use crate::{
3 error::{ParameterError, RytmError},
4 sysex::{AnySysexType, SysexType},
5};
6use rytm_rs_macro::parameter_range;
7
8#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub struct GlobalQuery {
11 object_number: usize,
13 sysex_type: SysexType,
14 device_id: u8,
15}
16
17impl GlobalQuery {
18 #[parameter_range(range = "global_slot:0..=3")]
22 pub fn new(global_slot: usize) -> Result<Self, RytmError> {
23 Ok(Self {
24 object_number: global_slot,
25 sysex_type: SysexType::Global,
26 device_id: 0,
27 })
28 }
29
30 #[parameter_range(range = "global_slot:0..=3")]
36 pub fn new_with_device_id(global_slot: usize, device_id: u8) -> Result<Self, RytmError> {
37 Ok(Self {
38 object_number: global_slot,
39 sysex_type: SysexType::Global,
40 device_id,
41 })
42 }
43
44 pub const fn new_targeting_work_buffer() -> Self {
46 Self {
47 object_number: 0b1000_0000,
48 sysex_type: SysexType::Global,
49 device_id: 0,
50 }
51 }
52
53 pub const fn new_targeting_work_buffer_with_device_id(device_id: u8) -> Self {
57 Self {
58 object_number: 0b1000_0000,
59 sysex_type: SysexType::Global,
60 device_id,
61 }
62 }
63}
64
65impl ObjectQuery for GlobalQuery {
66 fn sysex_type(&self) -> AnySysexType {
67 self.sysex_type.into()
68 }
69
70 fn device_id(&self) -> u8 {
71 self.device_id
72 }
73
74 fn obj_nr(&self) -> u16 {
75 self.object_number as u16
76 }
77}