conch_runtime_pshaw/spawn/ast_impl/
simple.rs

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