autd3capi_def/
dynamic_link.rs

1/*
2 * File: dynamic_link.rs
3 * Project: src
4 * Created Date: 06/10/2023
5 * Author: Shun Suzuki
6 * -----
7 * Last Modified: 06/11/2023
8 * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp)
9 * -----
10 * Copyright (c) 2023 Shun Suzuki. All rights reserved.
11 *
12 */
13
14use autd3_driver::{error::AUTDInternalError, geometry::Geometry, link::LinkSyncBuilder};
15
16use crate::L;
17
18type LinkBuilderGen = dyn FnOnce(&Geometry) -> Result<Box<L>, AUTDInternalError>;
19
20pub struct DynamicLinkBuilder {
21    link_gen: Box<LinkBuilderGen>,
22}
23
24impl DynamicLinkBuilder {
25    pub fn new<B: LinkSyncBuilder + 'static>(b: B) -> Self {
26        Self {
27            link_gen: Box::new(move |geometry| Ok(Box::new(b.open(geometry)?))),
28        }
29    }
30}
31
32impl LinkSyncBuilder for DynamicLinkBuilder {
33    type L = Box<L>;
34
35    fn open(self, geometry: &Geometry) -> Result<Self::L, AUTDInternalError> {
36        (self.link_gen)(geometry)
37    }
38}