1use std::sync::Once;
2
3use objc::{
4 class,
5 declare::ClassDecl,
6 runtime::{Class, Object, Sel},
7 sel, sel_impl,
8};
9
10use crate::objective_c_runtime::{id, traits::PNSObject};
11
12use super::{
13 Int, NSArray, NSDictionary, NSOrthography, NSRange, NSSpellServer, NSString,
14 NSTextCheckingResult, NSTextCheckingTypes, UInt, NSSPELLSERVER_PTR,
15};
16
17pub trait PNSSpellServerDelegate
19where
20 Self: PNSObject,
21{
22 #[allow(clippy::too_many_arguments)]
27 fn spell_server_check_string_offset_types_options_orthography_word_count(
28 &self,
29 _sender: NSSpellServer,
30 _string_to_check: NSString,
31 _offset: UInt,
32 _checking_types: NSTextCheckingTypes,
33 _options: NSDictionary<NSString, id>,
34 _orthography: NSOrthography,
35 _word_count: Int,
36 ) -> NSArray<NSTextCheckingResult> {
37 NSArray::default()
38 }
39
40 fn spell_server_suggest_guesses_for_word_in_language(
42 &self,
43 _sender: NSSpellServer,
44 _word: NSString,
45 _language: NSString,
46 ) -> NSArray<NSString> {
47 NSArray::default()
48 }
49
50 fn spell_server_check_grammar_in_string_language_details(
52 &self,
53 _sender: NSSpellServer,
54 _string_to_check: NSString,
55 _language: NSString,
56 _details: NSArray<NSDictionary<NSString, id>>,
57 ) -> NSRange {
58 NSRange::default()
59 }
60
61 fn spell_server_find_misspelled_word_in_string_language_word_count_count_only(
63 &self,
64 _sender: NSSpellServer,
65 _string_to_check: NSString,
66 _language: NSString,
67 _word_count: Int,
68 _count_only: bool,
69 ) -> NSRange {
70 NSRange::default()
71 }
72
73 fn spell_server_did_forget_word_in_language(
78 &self,
79 _sender: NSSpellServer,
80 _word: NSString,
81 _language: NSString,
82 ) {
83 }
84
85 fn spell_server_did_learn_word_in_language(
87 &self,
88 _sender: NSSpellServer,
89 _word: NSString,
90 _language: NSString,
91 ) {
92 }
93
94 fn spell_server_suggest_completions_for_partial_word_range_in_string_language(
95 &self,
96 _sender: NSSpellServer,
97 _range: NSRange,
98 _string: NSString,
99 _language: NSString,
100 ) -> NSArray<NSString> {
101 NSArray::default()
102 }
103
104 fn spell_server_record_response_to_correction_for_word_language(
105 &self,
106 _sender: NSSpellServer,
107 _response: UInt,
108 _correction: NSString,
109 _word: NSString,
110 _language: NSString,
111 ) {
112 }
113}
114
115fn ns_spell_server<T>(this: &mut Object) -> &mut T {
116 unsafe {
117 let ns_spell_server_ptr: usize = *this.get_ivar(NSSPELLSERVER_PTR);
118 let ns_spell_server = ns_spell_server_ptr as *mut T;
119 &mut *ns_spell_server
120 }
121}
122
123extern "C" fn spell_server_check_string_offset_types_options_orthography_word_count<
124 T: PNSSpellServerDelegate,
125>(
126 this: &mut Object,
127 _: Sel,
128 sender: NSSpellServer,
129 string_to_check: NSString,
130 offset: UInt,
131 checking_types: NSTextCheckingTypes,
132 options: NSDictionary<NSString, *mut Object>,
133 orthography: NSOrthography,
134 word_count: Int,
135) -> NSArray<NSTextCheckingResult> {
136 ns_spell_server::<T>(this)
137 .spell_server_check_string_offset_types_options_orthography_word_count(
138 sender,
139 string_to_check,
140 offset,
141 checking_types,
142 options,
143 orthography,
144 word_count,
145 )
146}
147
148extern "C" fn spell_server_suggest_guesses_for_word_in_language<T: PNSSpellServerDelegate>(
149 this: &mut Object,
150 _: Sel,
151 sender: NSSpellServer,
152 word: NSString,
153 language: NSString,
154) -> NSArray<NSString> {
155 ns_spell_server::<T>(this)
156 .spell_server_suggest_guesses_for_word_in_language(sender, word, language)
157}
158
159extern "C" fn spell_server_check_grammar_in_string_language_details<T: PNSSpellServerDelegate>(
160 this: &mut Object,
161 _: Sel,
162 sender: NSSpellServer,
163 string_to_check: NSString,
164 language: NSString,
165 details: NSArray<NSDictionary<NSString, id>>,
166) -> NSRange {
167 ns_spell_server::<T>(this).spell_server_check_grammar_in_string_language_details(
168 sender,
169 string_to_check,
170 language,
171 details,
172 )
173}
174
175extern "C" fn spell_server_find_misspelled_word_in_string_language_word_count_count_only<
176 T: PNSSpellServerDelegate,
177>(
178 this: &mut Object,
179 _: Sel,
180 sender: NSSpellServer,
181 string_to_check: NSString,
182 language: NSString,
183 word_count: Int,
184 count_only: bool,
185) -> NSRange {
186 ns_spell_server::<T>(this)
187 .spell_server_find_misspelled_word_in_string_language_word_count_count_only(
188 sender,
189 string_to_check,
190 language,
191 word_count,
192 count_only,
193 )
194}
195
196extern "C" fn spell_server_did_forget_word_in_language<T: PNSSpellServerDelegate>(
197 this: &mut Object,
198 _: Sel,
199 sender: NSSpellServer,
200 word: NSString,
201 language: NSString,
202) {
203 ns_spell_server::<T>(this).spell_server_did_forget_word_in_language(sender, word, language)
204}
205
206extern "C" fn spell_server_did_learn_word_in_language<T: PNSSpellServerDelegate>(
207 this: &mut Object,
208 _: Sel,
209 sender: NSSpellServer,
210 word: NSString,
211 language: NSString,
212) {
213 ns_spell_server::<T>(this).spell_server_did_learn_word_in_language(sender, word, language)
214}
215
216extern "C" fn spell_server_suggest_completions_for_partial_word_range_in_string_language<
217 T: PNSSpellServerDelegate,
218>(
219 this: &mut Object,
220 _: Sel,
221 sender: NSSpellServer,
222 range: NSRange,
223 string: NSString,
224 language: NSString,
225) -> NSArray<NSString> {
226 ns_spell_server::<T>(this)
227 .spell_server_suggest_completions_for_partial_word_range_in_string_language(
228 sender, range, string, language,
229 )
230}
231
232extern "C" fn spell_server_record_response_to_correction_for_word_language<
233 T: PNSSpellServerDelegate,
234>(
235 this: &mut Object,
236 _: Sel,
237 sender: NSSpellServer,
238 response: UInt,
239 correction: NSString,
240 word: NSString,
241 language: NSString,
242) {
243 ns_spell_server::<T>(this).spell_server_record_response_to_correction_for_word_language(
244 sender, response, correction, word, language,
245 )
246}
247
248pub fn register_ns_spell_server_delegate_class<T>() -> *const Class
249where
250 T: PNSSpellServerDelegate,
251{
252 static mut DELEGATE_CLASS: *const Class = 0 as *const Class;
253 static INIT: Once = Once::new();
254
255 INIT.call_once(|| unsafe {
256 let superclass = class!(NSObject);
257 let mut decl = ClassDecl::new("RSTNSSpellServerDelegate", superclass).unwrap();
258
259 decl.add_ivar::<usize>(NSSPELLSERVER_PTR);
260
261 decl.add_method(
262 sel!(spellServer:checkString:offset:types:options:orthography:wordCount:),
263 spell_server_check_string_offset_types_options_orthography_word_count::<T>
264 as extern "C" fn(
265 &mut Object,
266 _,
267 _,
268 _,
269 _,
270 _,
271 _,
272 _,
273 _,
274 ) -> NSArray<NSTextCheckingResult>,
275 );
276
277 decl.add_method(
278 sel!(spellServer:suggestGuessesForWord:inLanguage:),
279 spell_server_suggest_guesses_for_word_in_language::<T>
280 as extern "C" fn(&mut Object, _, _, _, _) -> NSArray<NSString>,
281 );
282
283 decl.add_method(
284 sel!(spellServer:checkGrammarInString:language:details:),
285 spell_server_check_grammar_in_string_language_details::<T>
286 as extern "C" fn(&mut Object, _, _, _, _, _) -> NSRange,
287 );
288
289 decl.add_method(
290 sel!(spellServer:findMisspelledWordInString:language:wordCount:countOnly:),
291 spell_server_find_misspelled_word_in_string_language_word_count_count_only::<T>
292 as extern "C" fn(&mut Object, _, _, _, _, _, _) -> NSRange,
293 );
294
295 decl.add_method(
296 sel!(spellServer:didForgetWord:inLanguage:),
297 spell_server_did_forget_word_in_language::<T> as extern "C" fn(&mut Object, _, _, _, _),
298 );
299
300 decl.add_method(
301 sel!(spellServer:didLearnWord:inLanguage:),
302 spell_server_did_learn_word_in_language::<T> as extern "C" fn(&mut Object, _, _, _, _),
303 );
304
305 decl.add_method(
306 sel!(spellServer:suggestCompletionsForPartialWordRange:inString:language:
307 ),
308 spell_server_suggest_completions_for_partial_word_range_in_string_language::<T>
309 as extern "C" fn(&mut Object, _, _, _, _, _) -> NSArray<NSString>,
310 );
311
312 decl.add_method(
313 sel!(spellServer:recordResponse:toCorrection:forWord:language:),
314 spell_server_record_response_to_correction_for_word_language::<T>
315 as extern "C" fn(&mut Object, _, _, _, _, _, _),
316 );
317
318 DELEGATE_CLASS = decl.register();
319 });
320
321 unsafe { DELEGATE_CLASS }
322}