maa_framework/
utility.rs

1use std::{ffi::c_void, fmt::Display, ptr::null_mut};
2
3use serde::{Deserialize, Serialize};
4
5use crate::{
6    buffer::{
7        image_list_buffer::MaaImageListBuffer, rect_buffer::MaaRectBuffer,
8        string_buffer::MaaStringBuffer,
9    },
10    Error,
11    internal, maa_bool, MaaResult,
12};
13use crate::buffer::image_buffer::MaaImageBuffer;
14
15#[repr(C)]
16#[derive(Debug, Serialize, Deserialize)]
17pub enum MaaLoggingLevel {
18    Off = 0,
19    Fatal = 1,
20    Error = 2,
21    Warn = 3,
22    Info = 4,
23    Debug = 5,
24    Trace = 6,
25    All = 7,
26}
27
28#[derive(Debug, Serialize, Deserialize)]
29pub enum MaaGlobalOption {
30    Invalid,
31    LogDir(String),
32    SaveDraw(bool),
33    Recording(bool),
34    StdoutLevel(MaaLoggingLevel),
35    ShowHitDraw(bool),
36    DebugMessage(bool),
37}
38
39impl Display for MaaGlobalOption {
40    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
41        match self {
42            MaaGlobalOption::Invalid => write!(f, "Invalid"),
43            MaaGlobalOption::LogDir(dir) => write!(f, "LogDir: {}", dir),
44            MaaGlobalOption::SaveDraw(save) => write!(f, "SaveDraw: {}", save),
45            MaaGlobalOption::Recording(recording) => write!(f, "Recording: {}", recording),
46            MaaGlobalOption::StdoutLevel(level) => write!(f, "StdoutLevel: {:?}", level),
47            MaaGlobalOption::ShowHitDraw(show) => write!(f, "ShowHitDraw: {}", show),
48            MaaGlobalOption::DebugMessage(debug) => write!(f, "DebugMessage: {}", debug),
49        }
50    }
51}
52
53impl MaaGlobalOption {
54    fn get_inner_key(&self) -> internal::MaaGlobalOption {
55        match self {
56            MaaGlobalOption::Invalid => internal::MaaGlobalOptionEnum_MaaGlobalOption_Invalid,
57            MaaGlobalOption::LogDir(_) => internal::MaaGlobalOptionEnum_MaaGlobalOption_LogDir,
58            MaaGlobalOption::SaveDraw(_) => internal::MaaGlobalOptionEnum_MaaGlobalOption_SaveDraw,
59            MaaGlobalOption::Recording(_) => {
60                internal::MaaGlobalOptionEnum_MaaGlobalOption_Recording
61            }
62            MaaGlobalOption::StdoutLevel(_) => {
63                internal::MaaGlobalOptionEnum_MaaGlobalOption_StdoutLevel
64            }
65            MaaGlobalOption::ShowHitDraw(_) => {
66                internal::MaaGlobalOptionEnum_MaaGlobalOption_ShowHitDraw
67            }
68            MaaGlobalOption::DebugMessage(_) => {
69                internal::MaaGlobalOptionEnum_MaaGlobalOption_DebugMessage
70            }
71        }
72    }
73}
74
75pub fn set_global_option(option: MaaGlobalOption) -> MaaResult<()> {
76    let key = option.get_inner_key();
77
78    let ret = match option {
79        MaaGlobalOption::LogDir(ref dir) => {
80            let c_dir = dir.as_ptr() as *mut c_void;
81            let len = dir.len() as u64;
82            unsafe { internal::MaaSetGlobalOption(key, c_dir, len) }
83        }
84        MaaGlobalOption::SaveDraw(ref save) => {
85            let val_size = std::mem::size_of::<bool>() as u64;
86            let value = save as *const bool as *mut c_void;
87            unsafe { internal::MaaSetGlobalOption(key, value, val_size) }
88        }
89        MaaGlobalOption::Recording(ref recording) => {
90            let val_size = std::mem::size_of::<bool>() as u64;
91            let value = recording as *const bool as *mut c_void;
92            unsafe { internal::MaaSetGlobalOption(key, value, val_size) }
93        }
94        MaaGlobalOption::StdoutLevel(ref level) => {
95            let val_size = std::mem::size_of::<MaaLoggingLevel>() as u64;
96            let value = level as *const MaaLoggingLevel as *mut c_void;
97            unsafe { internal::MaaSetGlobalOption(key, value, val_size) }
98        }
99        MaaGlobalOption::ShowHitDraw(ref show) => {
100            let val_size = std::mem::size_of::<bool>() as u64;
101            let value = show as *const bool as *mut c_void;
102            unsafe { internal::MaaSetGlobalOption(key, value, val_size) }
103        }
104        MaaGlobalOption::DebugMessage(ref debug) => {
105            let val_size = std::mem::size_of::<bool>() as u64;
106            let value = debug as *const bool as *mut c_void;
107            unsafe { internal::MaaSetGlobalOption(key, value, val_size) }
108        }
109        _ => unsafe { internal::MaaSetGlobalOption(key, null_mut(), 0) },
110    };
111
112    maa_bool!(ret, MaaSetGlobalOptionError, option)
113}
114
115#[derive(Debug, Serialize, Deserialize)]
116pub struct NodeDetail {
117    pub name: String,
118    pub reco_id: i64,
119    pub successful: bool,
120}
121
122pub fn query_node_detail(node_id: i64) -> NodeDetail {
123    let mut reco_id: i64 = 0;
124    let mut successful: u8 = 0;
125
126    let name = MaaStringBuffer::new();
127
128    unsafe {
129        internal::MaaQueryNodeDetail(node_id, name.handle, &mut reco_id, &mut successful);
130    }
131
132    let successful = maa_bool!(successful);
133    NodeDetail {
134        name: name.string(),
135        reco_id,
136        successful,
137    }
138}
139
140#[derive(Debug, Serialize, Deserialize)]
141pub struct TaskDetail {
142    pub entry: String,
143    pub node_id_list: Vec<i64>,
144}
145
146pub fn query_task_detail(task_id: i64) -> TaskDetail {
147    // first get size
148    let mut size: u64 = 0;
149    unsafe {
150        internal::MaaQueryTaskDetail(task_id, null_mut(), null_mut(), &mut size);
151    }
152
153    let entry = MaaStringBuffer::new();
154    let mut node_id_list = vec![0; size as usize];
155
156    unsafe {
157        internal::MaaQueryTaskDetail(task_id, entry.handle, node_id_list.as_mut_ptr(), &mut size);
158    }
159
160    TaskDetail {
161        entry: entry.string(),
162        node_id_list,
163    }
164}
165
166pub struct RecognitionDetail {
167    pub name: String,
168    pub hit: bool,
169    pub hit_box: MaaRectBuffer,
170    pub detail_json: String,
171    pub raw: MaaImageBuffer,
172    pub draws: MaaImageListBuffer,
173}
174
175pub fn query_recognition_detail(reco_id: i64) -> RecognitionDetail {
176    let name = MaaStringBuffer::new();
177    let mut hit: u8 = 0;
178    let hit_box: MaaRectBuffer = Default::default();
179    let detail_json: MaaStringBuffer = Default::default();
180    let raw = MaaImageBuffer::new();
181    let draws: MaaImageListBuffer = Default::default();
182
183    unsafe {
184        internal::MaaQueryRecognitionDetail(
185            reco_id,
186            name.handle,
187            &mut hit,
188            hit_box.handle,
189            detail_json.handle,
190            raw.handle,
191            draws.handle,
192        );
193    }
194
195    let hit = maa_bool!(hit);
196
197    RecognitionDetail {
198        name: name.string(),
199        hit,
200        hit_box,
201        detail_json: detail_json.string(),
202        raw,
203        draws,
204    }
205}