conch_runtime_pshaw/spawn/ast_impl/
top_level_impl.rs

1use 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}