conch_runtime_pshaw/spawn/ast_impl/
simple.rs1use crate::env::builtin::{BuiltinEnvironment, BuiltinUtility};
2use crate::env::{
3 AsyncIoEnvironment, EnvRestorer, ExecutableEnvironment, ExportedVariableEnvironment,
4 FileDescEnvironment, FileDescOpener, FunctionEnvironment, FunctionFrameEnvironment,
5 SetArgumentsEnvironment, UnsetVariableEnvironment, WorkingDirectoryEnvironment,
6};
7use crate::error::{CommandError, RedirectionError};
8use crate::eval::{RedirectEval, RedirectOrCmdWord, RedirectOrVarAssig, WordEval};
9use crate::io::FileDescWrapper;
10use crate::spawn::{simple_command, Spawn};
11use crate::ExitStatus;
12use conch_parser::ast;
13use futures_core::future::BoxFuture;
14use std::borrow::Borrow;
15use std::collections::VecDeque;
16use std::error::Error;
17
18#[async_trait::async_trait]
19impl<V, W, R, E> Spawn<E> for ast::SimpleCommand<V, W, R>
20where
21 R: Send + Sync + RedirectEval<E, Handle = E::FileHandle>,
22 R::Error: 'static + Send + Sync + Error + From<RedirectionError>,
23 V: Send + Sync + Clone,
24 W: Send + Sync + WordEval<E>,
25 W::EvalResult: Send,
26 W::Error: 'static + Send + Sync + Error,
27 E: ?Sized
28 + Send
29 + Sync
30 + AsyncIoEnvironment
31 + BuiltinEnvironment<BuiltinName = <E as FunctionEnvironment>::FnName>
32 + ExecutableEnvironment
33 + ExportedVariableEnvironment
34 + FileDescEnvironment
35 + FileDescOpener
36 + FunctionEnvironment
37 + FunctionFrameEnvironment
38 + SetArgumentsEnvironment
39 + UnsetVariableEnvironment
40 + WorkingDirectoryEnvironment,
41 E::Arg: Send + From<W::EvalResult>,
42 E::Args: Send + From<VecDeque<E::Arg>>,
43 E::Builtin: Send + Sync,
44 for<'a> E::Builtin: BuiltinUtility<'a, Vec<W::EvalResult>, EnvRestorer<'a, E>, E>,
45 E::FileHandle: Send + Sync + Clone + FileDescWrapper + From<E::OpenedFileHandle>,
46 E::FnName: Send + Sync + From<W::EvalResult>,
47 E::Fn: Send + Sync + Clone + Spawn<E>,
48 <E::Fn as Spawn<E>>::Error:
49 From<CommandError> + From<RedirectionError> + From<R::Error> + From<W::Error>,
50 E::IoHandle: Send + Sync + From<E::FileHandle>,
51 E::VarName: Send + Sync + Clone + Borrow<String> + From<V>,
52 E::Var: Send + Sync + Clone + Borrow<String> + From<W::EvalResult>,
53{
54 type Error = <E::Fn as Spawn<E>>::Error;
55
56 async fn spawn(&self, env: &mut E) -> Result<BoxFuture<'static, ExitStatus>, Self::Error> {
57 simple_command(
58 self.redirects_or_env_vars.iter().map(|rova| match rova {
59 ast::RedirectOrEnvVar::Redirect(r) => RedirectOrVarAssig::Redirect(r),
60 ast::RedirectOrEnvVar::EnvVar(k, v) => {
61 RedirectOrVarAssig::VarAssig(k.clone(), v.as_ref())
62 }
63 }),
64 self.redirects_or_cmd_words.iter().map(|rocw| match rocw {
65 ast::RedirectOrCmdWord::Redirect(r) => RedirectOrCmdWord::Redirect(r),
66 ast::RedirectOrCmdWord::CmdWord(w) => RedirectOrCmdWord::CmdWord(w),
67 }),
68 env,
69 )
70 .await
71 }
72}