Skip to main content

webview2_com/
callback.rs

1use windows::{
2    core::{implement, IUnknown, Interface, Ref, BOOL, HRESULT, PCWSTR},
3    Win32::System::Com::IStream,
4};
5
6use crate::{pwstr::string_from_pcwstr, Microsoft::Web::WebView2::Win32::*};
7
8pub trait ClosureArg {
9    type Output: Sized;
10}
11
12pub trait InvokeArg<'a> {
13    type Input: 'a;
14
15    fn convert(input: Self::Input) -> <Self as ClosureArg>::Output
16    where
17        Self: ClosureArg;
18}
19
20impl ClosureArg for HRESULT {
21    type Output = windows::core::Result<()>;
22}
23
24impl InvokeArg<'_> for HRESULT {
25    type Input = Self;
26
27    fn convert(input: HRESULT) -> windows::core::Result<()> {
28        input.ok()
29    }
30}
31
32impl ClosureArg for BOOL {
33    type Output = bool;
34}
35
36impl InvokeArg<'_> for BOOL {
37    type Input = Self;
38
39    fn convert(input: BOOL) -> bool {
40        input.as_bool()
41    }
42}
43
44impl ClosureArg for PCWSTR {
45    type Output = String;
46}
47
48impl<'a> InvokeArg<'a> for PCWSTR {
49    type Input = &'a Self;
50
51    fn convert(input: &PCWSTR) -> String {
52        string_from_pcwstr(input)
53    }
54}
55
56impl<I: Interface> ClosureArg for Option<I> {
57    type Output = Self;
58}
59
60impl<'a, I: 'a + Interface + Clone> InvokeArg<'a> for Option<I> {
61    type Input = Ref<'a, I>;
62
63    fn convert(input: Ref<'a, I>) -> <Self as ClosureArg>::Output {
64        input.cloned()
65    }
66}
67
68/// Generic closure signature for [`completed_callback`].
69pub type CompletedClosure<Arg1, Arg2> = Box<
70    dyn FnOnce(
71        <Arg1 as ClosureArg>::Output,
72        <Arg2 as ClosureArg>::Output,
73    ) -> ::windows::core::Result<()>,
74>;
75
76/// Generic closure signature for [`event_callback`].
77pub type EventClosure<Arg1, Arg2> = Box<
78    dyn FnMut(
79        <Arg1 as ClosureArg>::Output,
80        <Arg2 as ClosureArg>::Output,
81    ) -> windows::core::Result<()>,
82>;
83
84#[event_callback]
85pub struct IsDefaultDownloadDialogOpenChangedEventHandler(
86    ICoreWebView2IsDefaultDownloadDialogOpenChangedEventHandler,
87    Option<ICoreWebView2>,
88    Option<IUnknown>,
89);
90
91#[event_callback]
92pub struct IsDocumentPlayingAudioChangedEventHandler(
93    ICoreWebView2IsDocumentPlayingAudioChangedEventHandler,
94    Option<ICoreWebView2>,
95    Option<IUnknown>,
96);
97
98#[event_callback]
99pub struct IsMutedChangedEventHandler(
100    ICoreWebView2IsMutedChangedEventHandler,
101    Option<ICoreWebView2>,
102    Option<IUnknown>,
103);
104
105#[completed_callback]
106pub struct CreateCoreWebView2EnvironmentCompletedHandler(
107    ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler,
108    HRESULT,
109    Option<ICoreWebView2Environment>,
110);
111
112#[completed_callback]
113pub struct CreateCoreWebView2ControllerCompletedHandler(
114    ICoreWebView2CreateCoreWebView2ControllerCompletedHandler,
115    HRESULT,
116    Option<ICoreWebView2Controller>,
117);
118
119#[event_callback]
120pub struct NewBrowserVersionAvailableEventHandler(
121    ICoreWebView2NewBrowserVersionAvailableEventHandler,
122    Option<ICoreWebView2Environment>,
123    Option<IUnknown>,
124);
125
126#[completed_callback]
127pub struct CreateCoreWebView2CompositionControllerCompletedHandler(
128    ICoreWebView2CreateCoreWebView2CompositionControllerCompletedHandler,
129    HRESULT,
130    Option<ICoreWebView2CompositionController>,
131);
132
133#[event_callback]
134pub struct CursorChangedEventHandler(
135    ICoreWebView2CursorChangedEventHandler,
136    Option<ICoreWebView2CompositionController>,
137    Option<IUnknown>,
138);
139
140#[event_callback]
141pub struct ZoomFactorChangedEventHandler(
142    ICoreWebView2ZoomFactorChangedEventHandler,
143    Option<ICoreWebView2Controller>,
144    Option<IUnknown>,
145);
146
147#[event_callback]
148pub struct MoveFocusRequestedEventHandler(
149    ICoreWebView2MoveFocusRequestedEventHandler,
150    Option<ICoreWebView2Controller>,
151    Option<ICoreWebView2MoveFocusRequestedEventArgs>,
152);
153
154#[event_callback]
155pub struct FocusChangedEventHandler(
156    ICoreWebView2FocusChangedEventHandler,
157    Option<ICoreWebView2Controller>,
158    Option<IUnknown>,
159);
160
161#[event_callback]
162pub struct AcceleratorKeyPressedEventHandler(
163    ICoreWebView2AcceleratorKeyPressedEventHandler,
164    Option<ICoreWebView2Controller>,
165    Option<ICoreWebView2AcceleratorKeyPressedEventArgs>,
166);
167
168#[event_callback]
169pub struct ProcessInfosChangedEventHandler(
170    ICoreWebView2ProcessInfosChangedEventHandler,
171    Option<ICoreWebView2Environment>,
172    Option<IUnknown>,
173);
174
175#[event_callback]
176pub struct RasterizationScaleChangedEventHandler(
177    ICoreWebView2RasterizationScaleChangedEventHandler,
178    Option<ICoreWebView2Controller>,
179    Option<IUnknown>,
180);
181
182#[event_callback]
183pub struct NavigationStartingEventHandler(
184    ICoreWebView2NavigationStartingEventHandler,
185    Option<ICoreWebView2>,
186    Option<ICoreWebView2NavigationStartingEventArgs>,
187);
188
189#[event_callback]
190pub struct ContentLoadingEventHandler(
191    ICoreWebView2ContentLoadingEventHandler,
192    Option<ICoreWebView2>,
193    Option<ICoreWebView2ContentLoadingEventArgs>,
194);
195
196#[event_callback]
197pub struct SourceChangedEventHandler(
198    ICoreWebView2SourceChangedEventHandler,
199    Option<ICoreWebView2>,
200    Option<ICoreWebView2SourceChangedEventArgs>,
201);
202
203#[event_callback]
204pub struct DOMContentLoadedEventHandler(
205    ICoreWebView2DOMContentLoadedEventHandler,
206    Option<ICoreWebView2>,
207    Option<ICoreWebView2DOMContentLoadedEventArgs>,
208);
209
210#[event_callback]
211pub struct HistoryChangedEventHandler(
212    ICoreWebView2HistoryChangedEventHandler,
213    Option<ICoreWebView2>,
214    Option<IUnknown>,
215);
216
217#[event_callback]
218pub struct NavigationCompletedEventHandler(
219    ICoreWebView2NavigationCompletedEventHandler,
220    Option<ICoreWebView2>,
221    Option<ICoreWebView2NavigationCompletedEventArgs>,
222);
223
224#[event_callback]
225pub struct ScriptDialogOpeningEventHandler(
226    ICoreWebView2ScriptDialogOpeningEventHandler,
227    Option<ICoreWebView2>,
228    Option<ICoreWebView2ScriptDialogOpeningEventArgs>,
229);
230
231#[event_callback]
232pub struct PermissionRequestedEventHandler(
233    ICoreWebView2PermissionRequestedEventHandler,
234    Option<ICoreWebView2>,
235    Option<ICoreWebView2PermissionRequestedEventArgs>,
236);
237
238#[completed_callback]
239pub struct GetNonDefaultPermissionSettingsCompletedHandler(
240    ICoreWebView2GetNonDefaultPermissionSettingsCompletedHandler,
241    HRESULT,
242    Option<ICoreWebView2PermissionSettingCollectionView>,
243);
244
245#[completed_callback]
246pub struct SetPermissionStateCompletedHandler(
247    ICoreWebView2SetPermissionStateCompletedHandler,
248    HRESULT,
249);
250
251#[event_callback]
252pub struct ProcessFailedEventHandler(
253    ICoreWebView2ProcessFailedEventHandler,
254    Option<ICoreWebView2>,
255    Option<ICoreWebView2ProcessFailedEventArgs>,
256);
257
258impl ClosureArg for COREWEBVIEW2_PRINT_STATUS {
259    type Output = Self;
260}
261
262impl InvokeArg<'_> for COREWEBVIEW2_PRINT_STATUS {
263    type Input = Self;
264
265    fn convert(input: Self) -> Self {
266        input
267    }
268}
269
270#[completed_callback]
271pub struct PrintCompletedHandler(
272    ICoreWebView2PrintCompletedHandler,
273    HRESULT,
274    COREWEBVIEW2_PRINT_STATUS,
275);
276
277#[completed_callback]
278pub struct PrintToPdfCompletedHandler(ICoreWebView2PrintToPdfCompletedHandler, HRESULT, BOOL);
279
280#[completed_callback]
281pub struct PrintToPdfStreamCompletedHandler(
282    ICoreWebView2PrintToPdfStreamCompletedHandler,
283    HRESULT,
284    Option<IStream>,
285);
286
287#[completed_callback]
288pub struct AddScriptToExecuteOnDocumentCreatedCompletedHandler(
289    ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler,
290    HRESULT,
291    PCWSTR,
292);
293
294#[completed_callback]
295pub struct ExecuteScriptCompletedHandler(
296    ICoreWebView2ExecuteScriptCompletedHandler,
297    HRESULT,
298    PCWSTR,
299);
300
301#[completed_callback]
302pub struct CapturePreviewCompletedHandler(ICoreWebView2CapturePreviewCompletedHandler, HRESULT);
303
304#[event_callback]
305pub struct WebMessageReceivedEventHandler(
306    ICoreWebView2WebMessageReceivedEventHandler,
307    Option<ICoreWebView2>,
308    Option<ICoreWebView2WebMessageReceivedEventArgs>,
309);
310
311#[completed_callback]
312pub struct CallDevToolsProtocolMethodCompletedHandler(
313    ICoreWebView2CallDevToolsProtocolMethodCompletedHandler,
314    HRESULT,
315    PCWSTR,
316);
317
318#[event_callback]
319pub struct NewWindowRequestedEventHandler(
320    ICoreWebView2NewWindowRequestedEventHandler,
321    Option<ICoreWebView2>,
322    Option<ICoreWebView2NewWindowRequestedEventArgs>,
323);
324
325#[event_callback]
326pub struct DocumentTitleChangedEventHandler(
327    ICoreWebView2DocumentTitleChangedEventHandler,
328    Option<ICoreWebView2>,
329    Option<IUnknown>,
330);
331
332#[event_callback]
333pub struct ContainsFullScreenElementChangedEventHandler(
334    ICoreWebView2ContainsFullScreenElementChangedEventHandler,
335    Option<ICoreWebView2>,
336    Option<IUnknown>,
337);
338
339#[event_callback]
340pub struct WebResourceRequestedEventHandler(
341    ICoreWebView2WebResourceRequestedEventHandler,
342    Option<ICoreWebView2>,
343    Option<ICoreWebView2WebResourceRequestedEventArgs>,
344);
345
346#[event_callback]
347pub struct WebResourceResponseReceivedEventHandler(
348    ICoreWebView2WebResourceResponseReceivedEventHandler,
349    Option<ICoreWebView2>,
350    Option<ICoreWebView2WebResourceResponseReceivedEventArgs>,
351);
352
353#[completed_callback]
354pub struct WebResourceResponseViewGetContentCompletedHandler(
355    ICoreWebView2WebResourceResponseViewGetContentCompletedHandler,
356    HRESULT,
357    Option<IStream>,
358);
359
360#[event_callback]
361pub struct WindowCloseRequestedEventHandler(
362    ICoreWebView2WindowCloseRequestedEventHandler,
363    Option<ICoreWebView2>,
364    Option<IUnknown>,
365);
366
367#[event_callback]
368pub struct DownloadStartingEventHandler(
369    ICoreWebView2DownloadStartingEventHandler,
370    Option<ICoreWebView2>,
371    Option<ICoreWebView2DownloadStartingEventArgs>,
372);
373
374#[event_callback]
375pub struct BytesReceivedChangedEventHandler(
376    ICoreWebView2BytesReceivedChangedEventHandler,
377    Option<ICoreWebView2DownloadOperation>,
378    Option<IUnknown>,
379);
380
381#[event_callback]
382pub struct BrowserProcessExitedEventHandler(
383    ICoreWebView2BrowserProcessExitedEventHandler,
384    Option<ICoreWebView2Environment>,
385    Option<ICoreWebView2BrowserProcessExitedEventArgs>,
386);
387
388#[event_callback]
389pub struct EstimatedEndTimeChangedEventHandler(
390    ICoreWebView2EstimatedEndTimeChangedEventHandler,
391    Option<ICoreWebView2DownloadOperation>,
392    Option<IUnknown>,
393);
394
395#[event_callback]
396pub struct StateChangedEventHandler(
397    ICoreWebView2StateChangedEventHandler,
398    Option<ICoreWebView2DownloadOperation>,
399    Option<IUnknown>,
400);
401
402#[event_callback]
403pub struct DevToolsProtocolEventReceivedEventHandler(
404    ICoreWebView2DevToolsProtocolEventReceivedEventHandler,
405    Option<ICoreWebView2>,
406    Option<ICoreWebView2DevToolsProtocolEventReceivedEventArgs>,
407);
408
409#[event_callback]
410pub struct FrameContentLoadingEventHandler(
411    ICoreWebView2FrameContentLoadingEventHandler,
412    Option<ICoreWebView2Frame>,
413    Option<ICoreWebView2ContentLoadingEventArgs>,
414);
415
416#[event_callback]
417pub struct FrameCreatedEventHandler(
418    ICoreWebView2FrameCreatedEventHandler,
419    Option<ICoreWebView2>,
420    Option<ICoreWebView2FrameCreatedEventArgs>,
421);
422
423#[event_callback]
424pub struct FrameDOMContentLoadedEventHandler(
425    ICoreWebView2FrameDOMContentLoadedEventHandler,
426    Option<ICoreWebView2Frame>,
427    Option<ICoreWebView2DOMContentLoadedEventArgs>,
428);
429
430#[event_callback]
431pub struct FrameDestroyedEventHandler(
432    ICoreWebView2FrameDestroyedEventHandler,
433    Option<ICoreWebView2Frame>,
434    Option<IUnknown>,
435);
436
437#[event_callback]
438pub struct FrameNameChangedEventHandler(
439    ICoreWebView2FrameNameChangedEventHandler,
440    Option<ICoreWebView2Frame>,
441    Option<IUnknown>,
442);
443
444#[event_callback]
445pub struct ClientCertificateRequestedEventHandler(
446    ICoreWebView2ClientCertificateRequestedEventHandler,
447    Option<ICoreWebView2>,
448    Option<ICoreWebView2ClientCertificateRequestedEventArgs>,
449);
450
451#[completed_callback]
452pub struct FrameNavigationCompletedEventHandler(
453    ICoreWebView2FrameNavigationCompletedEventHandler,
454    Option<ICoreWebView2Frame>,
455    Option<ICoreWebView2NavigationCompletedEventArgs>,
456);
457
458#[event_callback]
459pub struct FrameNavigationStartingEventHandler(
460    ICoreWebView2FrameNavigationStartingEventHandler,
461    Option<ICoreWebView2Frame>,
462    Option<ICoreWebView2NavigationStartingEventArgs>,
463);
464
465#[event_callback]
466pub struct FrameWebMessageReceivedEventHandler(
467    ICoreWebView2FrameWebMessageReceivedEventHandler,
468    Option<ICoreWebView2Frame>,
469    Option<ICoreWebView2WebMessageReceivedEventArgs>,
470);
471
472#[completed_callback]
473pub struct GetCookiesCompletedHandler(
474    ICoreWebView2GetCookiesCompletedHandler,
475    HRESULT,
476    Option<ICoreWebView2CookieList>,
477);
478
479#[completed_callback]
480pub struct TrySuspendCompletedHandler(ICoreWebView2TrySuspendCompletedHandler, HRESULT, BOOL);
481
482#[event_callback]
483pub struct BasicAuthenticationRequestedEventHandler(
484    ICoreWebView2BasicAuthenticationRequestedEventHandler,
485    Option<ICoreWebView2>,
486    Option<ICoreWebView2BasicAuthenticationRequestedEventArgs>,
487);
488
489#[event_callback]
490pub struct ContextMenuRequestedEventHandler(
491    ICoreWebView2ContextMenuRequestedEventHandler,
492    Option<ICoreWebView2>,
493    Option<ICoreWebView2ContextMenuRequestedEventArgs>,
494);
495
496#[event_callback]
497pub struct CustomItemSelectedEventHandler(
498    ICoreWebView2CustomItemSelectedEventHandler,
499    Option<ICoreWebView2ContextMenuItem>,
500    Option<IUnknown>,
501);
502
503#[event_callback]
504pub struct FramePermissionRequestedEventHandler(
505    ICoreWebView2FramePermissionRequestedEventHandler,
506    Option<ICoreWebView2Frame>,
507    Option<ICoreWebView2PermissionRequestedEventArgs2>,
508);
509
510#[event_callback]
511pub struct StatusBarTextChangedEventHandler(
512    ICoreWebView2StatusBarTextChangedEventHandler,
513    Option<ICoreWebView2>,
514    Option<IUnknown>,
515);
516
517#[completed_callback]
518pub struct ClearBrowsingDataCompletedHandler(
519    ICoreWebView2ClearBrowsingDataCompletedHandler,
520    HRESULT,
521);
522
523#[completed_callback]
524pub struct ClearServerCertificateErrorActionsCompletedHandler(
525    ICoreWebView2ClearServerCertificateErrorActionsCompletedHandler,
526    HRESULT,
527);
528
529#[event_callback]
530pub struct ServerCertificateErrorDetectedEventHandler(
531    ICoreWebView2ServerCertificateErrorDetectedEventHandler,
532    Option<ICoreWebView2>,
533    Option<ICoreWebView2ServerCertificateErrorDetectedEventArgs>,
534);
535
536#[event_callback]
537pub struct FaviconChangedEventHandler(
538    ICoreWebView2FaviconChangedEventHandler,
539    Option<ICoreWebView2>,
540    Option<IUnknown>,
541);
542
543#[completed_callback]
544pub struct GetFaviconCompletedHandler(
545    ICoreWebView2GetFaviconCompletedHandler,
546    HRESULT,
547    Option<IStream>,
548);
549
550#[event_callback]
551pub struct LaunchingExternalUriSchemeEventHandler(
552    ICoreWebView2LaunchingExternalUriSchemeEventHandler,
553    Option<ICoreWebView2>,
554    Option<ICoreWebView2LaunchingExternalUriSchemeEventArgs>,
555);
556
557#[completed_callback]
558pub struct BrowserExtensionEnableCompletedHandler(
559    ICoreWebView2BrowserExtensionEnableCompletedHandler,
560    HRESULT,
561);
562
563#[completed_callback]
564pub struct BrowserExtensionRemoveCompletedHandler(
565    ICoreWebView2BrowserExtensionRemoveCompletedHandler,
566    HRESULT,
567);
568
569#[completed_callback]
570pub struct ExecuteScriptWithResultCompletedHandler(
571    ICoreWebView2ExecuteScriptWithResultCompletedHandler,
572    HRESULT,
573    Option<ICoreWebView2ExecuteScriptResult>,
574);
575
576#[completed_callback]
577pub struct GetProcessExtendedInfosCompletedHandler(
578    ICoreWebView2GetProcessExtendedInfosCompletedHandler,
579    HRESULT,
580    Option<ICoreWebView2ProcessExtendedInfoCollection>,
581);
582
583#[completed_callback]
584pub struct ProfileAddBrowserExtensionCompletedHandler(
585    ICoreWebView2ProfileAddBrowserExtensionCompletedHandler,
586    HRESULT,
587    Option<ICoreWebView2BrowserExtension>,
588);
589
590#[event_callback]
591pub struct ProfileDeletedEventHandler(
592    ICoreWebView2ProfileDeletedEventHandler,
593    Option<ICoreWebView2Profile>,
594    Option<IUnknown>,
595);
596
597#[completed_callback]
598pub struct ProfileGetBrowserExtensionsCompletedHandler(
599    ICoreWebView2ProfileGetBrowserExtensionsCompletedHandler,
600    HRESULT,
601    Option<ICoreWebView2BrowserExtensionList>,
602);
603
604#[event_callback]
605pub struct NonClientRegionChangedEventHandler(
606    ICoreWebView2NonClientRegionChangedEventHandler,
607    Option<ICoreWebView2CompositionController>,
608    Option<ICoreWebView2NonClientRegionChangedEventArgs>,
609);
610
611#[event_callback]
612pub struct FrameScreenCaptureStartingEventHandler(
613    ICoreWebView2FrameScreenCaptureStartingEventHandler,
614    Option<ICoreWebView2Frame>,
615    Option<ICoreWebView2ScreenCaptureStartingEventArgs>,
616);
617
618#[event_callback]
619pub struct NotificationCloseRequestedEventHandler(
620    ICoreWebView2NotificationCloseRequestedEventHandler,
621    Option<ICoreWebView2Notification>,
622    Option<IUnknown>,
623);
624
625#[event_callback]
626pub struct NotificationReceivedEventHandler(
627    ICoreWebView2NotificationReceivedEventHandler,
628    Option<ICoreWebView2>,
629    Option<ICoreWebView2NotificationReceivedEventArgs>,
630);
631
632#[event_callback]
633pub struct SaveAsUIShowingEventHandler(
634    ICoreWebView2SaveAsUIShowingEventHandler,
635    Option<ICoreWebView2>,
636    Option<ICoreWebView2SaveAsUIShowingEventArgs>,
637);
638
639#[event_callback]
640pub struct SaveFileSecurityCheckStartingEventHandler(
641    ICoreWebView2SaveFileSecurityCheckStartingEventHandler,
642    Option<ICoreWebView2>,
643    Option<ICoreWebView2SaveFileSecurityCheckStartingEventArgs>,
644);
645
646#[event_callback]
647pub struct ScreenCaptureStartingEventHandler(
648    ICoreWebView2ScreenCaptureStartingEventHandler,
649    Option<ICoreWebView2>,
650    Option<ICoreWebView2ScreenCaptureStartingEventArgs>,
651);
652
653#[event_callback]
654pub struct FrameChildFrameCreatedEventHandler(
655    ICoreWebView2FrameChildFrameCreatedEventHandler,
656    Option<ICoreWebView2Frame>,
657    Option<ICoreWebView2FrameCreatedEventArgs>,
658);
659
660#[event_callback]
661pub struct FindActiveMatchIndexChangedEventHandler(
662    ICoreWebView2FindActiveMatchIndexChangedEventHandler,
663    Option<ICoreWebView2Find>,
664    Option<IUnknown>,
665);
666
667#[event_callback]
668pub struct FindMatchCountChangedEventHandler(
669    ICoreWebView2FindMatchCountChangedEventHandler,
670    Option<ICoreWebView2Find>,
671    Option<IUnknown>,
672);
673
674#[completed_callback]
675pub struct FindStartCompletedHandler(ICoreWebView2FindStartCompletedHandler, HRESULT);
676
677impl ClosureArg for COREWEBVIEW2_SAVE_AS_UI_RESULT {
678    type Output = Self;
679}
680
681impl InvokeArg<'_> for COREWEBVIEW2_SAVE_AS_UI_RESULT {
682    type Input = Self;
683
684    fn convert(input: Self) -> Self {
685        input
686    }
687}
688
689#[completed_callback]
690pub struct ShowSaveAsUICompletedHandler(
691    ICoreWebView2ShowSaveAsUICompletedHandler,
692    HRESULT,
693    COREWEBVIEW2_SAVE_AS_UI_RESULT,
694);
695
696#[event_callback]
697pub struct DragStartingEventHandler(
698    ICoreWebView2DragStartingEventHandler,
699    Option<ICoreWebView2CompositionController>,
700    Option<ICoreWebView2DragStartingEventArgs>,
701);
702
703#[cfg(test)]
704mod test {
705    use std::collections::BTreeSet;
706
707    use regex::Regex;
708
709    use webview2_com_sys::declared_interfaces;
710
711    #[test]
712    fn all_implemented() {
713        let contents = include_str!("callback.rs");
714        let pattern = Regex::new(r#"(ICoreWebView2[A-Za-z0-9]+Handler)"#).expect("valid regex");
715        let implemented: BTreeSet<&str> = contents
716            .lines()
717            .filter_map(|line| pattern.captures(line))
718            .filter_map(|captures| captures.get(1))
719            .map(|match_1| match_1.as_str())
720            .collect();
721        let all_declared_callbacks = declared_interfaces::all_declared_callbacks();
722        let missing: Vec<_> = all_declared_callbacks
723            .iter()
724            .filter_map(|name| {
725                if implemented.contains(name) {
726                    None
727                } else {
728                    Some(name.to_string())
729                }
730            })
731            .collect();
732        let extra: Vec<_> = implemented
733            .iter()
734            .filter_map(|name| {
735                if all_declared_callbacks.contains(name) {
736                    None
737                } else {
738                    Some(name.to_string())
739                }
740            })
741            .collect();
742        assert!(
743            missing.is_empty() && extra.is_empty(),
744            "missing: {missing:?}\nextra: {extra:?}"
745        );
746    }
747}