vantage_vista/transaction/
wrap.rs1use std::sync::Arc;
5
6use vantage_core::Result;
7
8use super::{Transaction, cant_take_part, joining::joining, shell::TxShell};
9use crate::{resolver::VistaResolver, vista::Vista};
10
11impl Transaction {
12 pub fn wrap(&self, vista: &Vista) -> Vista {
21 let (rebound, joined) = joining(self, || {
22 self.check_open().and_then(|()| vista.shell().rebind(self))
23 });
24 let rebound = rebound.map_err(|err| {
25 if err.is_unsupported() {
26 cant_take_part(vista.name())
27 } else {
28 err
29 }
30 });
31 let name = vista.name().to_string();
32 vista
33 .clone()
34 .map_shell(|original| TxShell::new(original, rebound, joined, name, self.clone()))
35 }
36
37 pub fn resolver(&self, base: Arc<dyn VistaResolver>) -> Arc<dyn VistaResolver> {
40 Arc::new(TxResolver {
41 tx: self.clone(),
42 base,
43 })
44 }
45}
46
47struct TxResolver {
48 tx: Transaction,
49 base: Arc<dyn VistaResolver>,
50}
51
52impl VistaResolver for TxResolver {
53 fn vista(&self, name: &str) -> Result<Vista> {
54 Ok(self.tx.wrap(&self.base.vista(name)?))
55 }
56
57 fn adopt(&self, vista: Vista) -> Vista {
58 self.tx.wrap(&self.base.adopt(vista))
59 }
60}