visionkit/
image_analysis.rs1use 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}