Skip to main content

visionkit/
image_analysis.rs

1use core::ffi::{c_char, c_void};
2use core::ptr;
3
4use crate::error::VisionKitError;
5use crate::ffi;
6use crate::image_analyzer::ImageAnalysisTypes;
7use crate::private::{error_from_status, string_from_ptr};
8
9pub struct ImageAnalysis {
10    pub(crate) token: *mut c_void,
11}
12
13impl Drop for ImageAnalysis {
14    fn drop(&mut self) {
15        if !self.token.is_null() {
16            unsafe { ffi::image_analysis::vk_image_analysis_release(self.token) };
17            self.token = ptr::null_mut();
18        }
19    }
20}
21
22impl ImageAnalysis {
23    pub(crate) fn from_token(token: *mut c_void) -> Self {
24        Self { token }
25    }
26
27    pub(crate) fn raw_token(&self) -> *mut c_void {
28        self.token
29    }
30
31    pub fn transcript(&self) -> Result<String, VisionKitError> {
32        let mut transcript: *mut c_char = ptr::null_mut();
33        let mut err_msg: *mut c_char = ptr::null_mut();
34        let status = unsafe {
35            ffi::image_analysis::vk_image_analysis_transcript(
36                self.token,
37                &mut transcript,
38                &mut err_msg,
39            )
40        };
41        if status == ffi::status::OK {
42            unsafe { string_from_ptr(transcript, "image analysis transcript") }
43        } else {
44            Err(unsafe { error_from_status(status, err_msg) })
45        }
46    }
47
48    pub fn has_results(&self, analysis_types: ImageAnalysisTypes) -> Result<bool, VisionKitError> {
49        let mut has_results = 0;
50        let mut err_msg: *mut c_char = ptr::null_mut();
51        let status = unsafe {
52            ffi::image_analysis::vk_image_analysis_has_results(
53                self.token,
54                analysis_types.bits(),
55                &mut has_results,
56                &mut err_msg,
57            )
58        };
59        if status == ffi::status::OK {
60            Ok(has_results != 0)
61        } else {
62            Err(unsafe { error_from_status(status, err_msg) })
63        }
64    }
65}