conch_runtime_pshaw/spawn/ast_impl/
top_level_impl.rs1use crate::env::builtin::{BuiltinEnvironment, BuiltinUtility};
2use crate::env::{
3 ArgumentsEnvironment, AsyncIoEnvironment, EnvRestorer, ExecutableEnvironment,
4 ExportedVariableEnvironment, FileDescEnvironment, FileDescOpener, FunctionEnvironment,
5 FunctionFrameEnvironment, IsInteractiveEnvironment, LastStatusEnvironment,
6 ReportErrorEnvironment, SetArgumentsEnvironment, StringWrapper, SubEnvironment,
7 UnsetVariableEnvironment, WorkingDirectoryEnvironment,
8};
9use crate::error::RuntimeError;
10use crate::eval::{WordEval, WordEvalConfig, WordEvalResult};
11use crate::io::FileDescWrapper;
12use crate::spawn::Spawn;
13use crate::ExitStatus;
14use conch_parser::ast::{AtomicTopLevelCommand, AtomicTopLevelWord};
15use futures_core::future::BoxFuture;
16use std::collections::VecDeque;
17use std::fmt::Display;
18use std::sync::Arc;
19
20impl<T, E> Spawn<E> for AtomicTopLevelCommand<T>
21where
22 T: 'static + StringWrapper + Display + Send + Sync,
23 E: ?Sized
24 + Send
25 + Sync
26 + AsyncIoEnvironment
27 + ArgumentsEnvironment<Arg = T>
28 + BuiltinEnvironment<BuiltinName = <E as FunctionEnvironment>::FnName>
29 + ExecutableEnvironment
30 + ExportedVariableEnvironment<VarName = T, Var = T>
31 + FileDescEnvironment
32 + FileDescOpener
33 + FunctionEnvironment
34 + FunctionFrameEnvironment
35 + IsInteractiveEnvironment
36 + LastStatusEnvironment
37 + ReportErrorEnvironment
38 + SetArgumentsEnvironment
39 + SubEnvironment
40 + UnsetVariableEnvironment
41 + WorkingDirectoryEnvironment,
42 E::Args: Send + From<VecDeque<E::Arg>>,
43 E::Builtin: Send + Sync,
44 for<'a> E::Builtin: BuiltinUtility<'a, Vec<T>, EnvRestorer<'a, E>, E>,
45 E::FileHandle: Send + Sync + Clone + FileDescWrapper + From<E::OpenedFileHandle>,
46 E::OpenedFileHandle: Send,
47 E::FnName: Send + Sync + From<T>,
48 E::Fn: Send
49 + Sync
50 + Clone
51 + From<Arc<dyn Spawn<E, Error = RuntimeError> + 'static + Send + Sync>>
52 + Spawn<E, Error = RuntimeError>,
53 E::IoHandle: Send + Sync + From<E::FileHandle> + From<E::OpenedFileHandle>,
54{
55 type Error = RuntimeError;
56
57 fn spawn<'life0, 'life1, 'async_trait>(
58 &'life0 self,
59 env: &'life1 mut E,
60 ) -> BoxFuture<'async_trait, Result<BoxFuture<'static, ExitStatus>, Self::Error>>
61 where
62 'life0: 'async_trait,
63 'life1: 'async_trait,
64 Self: 'async_trait,
65 {
66 self.0.spawn(env)
67 }
68}
69
70impl<T, E> WordEval<E> for AtomicTopLevelWord<T>
71where
72 T: 'static + StringWrapper + Display + Send + Sync,
73 E: ?Sized
74 + Send
75 + Sync
76 + AsyncIoEnvironment
77 + ArgumentsEnvironment<Arg = T>
78 + BuiltinEnvironment<BuiltinName = <E as FunctionEnvironment>::FnName>
79 + ExecutableEnvironment
80 + ExportedVariableEnvironment<VarName = T, Var = T>
81 + FileDescEnvironment
82 + FileDescOpener
83 + FunctionEnvironment
84 + FunctionFrameEnvironment
85 + IsInteractiveEnvironment
86 + LastStatusEnvironment
87 + ReportErrorEnvironment
88 + SetArgumentsEnvironment
89 + SubEnvironment
90 + UnsetVariableEnvironment
91 + WorkingDirectoryEnvironment,
92 E::Args: Send + From<VecDeque<E::Arg>>,
93 E::Builtin: Send + Sync,
94 for<'a> E::Builtin: BuiltinUtility<'a, Vec<T>, EnvRestorer<'a, E>, E>,
95 E::FileHandle: Send + Sync + Clone + FileDescWrapper + From<E::OpenedFileHandle>,
96 E::OpenedFileHandle: Send,
97 E::FnName: Send + Sync + From<T>,
98 E::Fn: Send
99 + Sync
100 + Clone
101 + From<Arc<dyn Spawn<E, Error = RuntimeError> + 'static + Send + Sync>>
102 + Spawn<E, Error = RuntimeError>,
103 E::IoHandle: Send + Sync + From<E::FileHandle> + From<E::OpenedFileHandle>,
104{
105 type EvalResult = T;
106 type Error = RuntimeError;
107
108 fn eval_with_config<'life0, 'life1, 'async_trait>(
109 &'life0 self,
110 env: &'life1 mut E,
111 cfg: WordEvalConfig,
112 ) -> BoxFuture<'async_trait, WordEvalResult<Self::EvalResult, Self::Error>>
113 where
114 'life0: 'async_trait,
115 'life1: 'async_trait,
116 Self: 'async_trait,
117 {
118 self.0.eval_with_config(env, cfg)
119 }
120}