Skip to main content

visionkit/
vn_document_camera_view_controller.rs

1use core::ffi::c_char;
2use core::ptr;
3
4use crate::error::VisionKitError;
5use crate::ffi;
6use crate::private::{error_from_status, parse_area_support_info_ptr};
7use crate::support::AreaSupportInfo;
8
9/// Wraps the VisionKit VNDocumentCameraViewController counterpart.
10pub struct VNDocumentCameraViewController;
11
12impl VNDocumentCameraViewController {
13    /// Returns VisionKit availability metadata for this area.
14    pub fn support_info() -> Result<AreaSupportInfo, VisionKitError> {
15        let mut support_json: *mut c_char = ptr::null_mut();
16        let mut err_msg: *mut c_char = ptr::null_mut();
17        let status = unsafe {
18            ffi::vn_document_camera_view_controller::vk_vn_document_camera_view_controller_support_json(
19                &mut support_json,
20                &mut err_msg,
21            )
22        };
23        if status == ffi::status::OK {
24            unsafe {
25                parse_area_support_info_ptr(
26                    support_json,
27                    "VNDocumentCameraViewController support info",
28                )
29            }
30        } else {
31            Err(unsafe { error_from_status(status, err_msg) })
32        }
33    }
34
35    /// Returns whether this VisionKit area is available on the current platform.
36    pub fn is_available_on_current_platform() -> Result<bool, VisionKitError> {
37        Ok(Self::support_info()?.available_on_current_platform)
38    }
39
40    /// Creates the VisionKit `VNDocumentCameraViewController` wrapper.
41    pub fn new() -> Result<Self, VisionKitError> {
42        let info = Self::support_info()?;
43        if info.available_on_current_platform {
44            Ok(Self)
45        } else {
46            Err(info.unavailable_error())
47        }
48    }
49}