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 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}