use crate::{arc, cm, define_cls, define_obj_type, ns, objc, vn};
define_obj_type!(
#[doc(alias = "VNStatefulRequest")]
pub StatefulRequest(vn::ImageBasedRequest)
);
impl arc::A<StatefulRequest> {
#[objc::msg_send(initWithFrameAnalysisSpacing:completionHandler:)]
pub fn init_with_frame_analysis_spacing_ch(
self,
frame_analysis_spacing: cm::Time,
ch: Option<&mut vn::RequestCh>,
) -> arc::R<StatefulRequest>;
}
impl StatefulRequest {
define_cls!(VN_STATEFUL_REQUEST);
pub fn with_frame_analysis_spacing_ch(
frame_analysis_spacing: cm::Time,
ch: Option<&mut vn::RequestCh>,
) -> arc::R<Self> {
Self::alloc().init_with_frame_analysis_spacing_ch(frame_analysis_spacing, ch)
}
pub fn with_frame_analysis_spacing(
frame_analysis_spacing: cm::Time,
completion: impl FnMut(&mut vn::Request, Option<&ns::Error>) + 'static,
) -> arc::R<Self> {
let mut block = vn::RequestCh::new2(completion);
Self::with_frame_analysis_spacing_ch(frame_analysis_spacing, Some(&mut block))
}
#[objc::msg_send(minimumLatencyFrameCount)]
pub fn minimum_latency_frame_count(&self) -> isize;
#[objc::msg_send(frameAnalysisSpacing)]
pub fn frame_analysis_spacing(&self) -> cm::Time;
}
#[link(name = "vn", kind = "static")]
unsafe extern "C" {
static VN_STATEFUL_REQUEST: &'static objc::Class<StatefulRequest>;
}
#[cfg(test)]
mod tests {
use crate::{cm, vn};
#[test]
pub fn basics() {
let request = vn::StatefulRequest::with_frame_analysis_spacing_ch(cm::Time::zero(), None);
assert_eq!(request.frame_analysis_spacing(), cm::Time::zero());
let request =
vn::StatefulRequest::with_frame_analysis_spacing(cm::Time::zero(), |request, error| {
if let Some(err) = error {
println!("err {err:?}");
return;
}
let _r = request.results();
});
assert_eq!(request.frame_analysis_spacing(), cm::Time::zero());
}
}