use super::Env;
use crate::alias::AliasSet;
use crate::any::DataSet;
use crate::builtin::Builtin;
use crate::function::FunctionSet;
use crate::io::Fd;
use crate::job::{JobList, Pid};
use crate::option::OptionSet;
use crate::semantics::ExitStatus;
use crate::stack::Stack;
use crate::trap::TrapSet;
use crate::variable::VariableSet;
use std::collections::HashMap;
use std::mem::take;
#[derive(Debug)]
pub struct ForkEnvState<S> {
aliases: AliasSet,
arg0: String,
builtins: HashMap<&'static str, Builtin<S>>,
exit_status: ExitStatus,
functions: FunctionSet<S>,
jobs: JobList,
main_pgid: Pid,
main_pid: Pid,
options: OptionSet,
stack: Stack,
traps: TrapSet,
tty: Option<Fd>,
variables: VariableSet,
any: DataSet,
}
impl<S> ForkEnvState<S> {
#[must_use]
pub fn extract_from_env(env: &mut Env<S>) -> Self {
Self {
aliases: take(&mut env.aliases),
arg0: take(&mut env.arg0),
builtins: take(&mut env.builtins),
exit_status: env.exit_status,
functions: take(&mut env.functions),
jobs: take(&mut env.jobs),
main_pgid: env.main_pgid,
main_pid: env.main_pid,
options: env.options,
stack: take(&mut env.stack),
traps: take(&mut env.traps),
tty: env.tty,
variables: take(&mut env.variables),
any: take(&mut env.any),
}
}
pub fn restore_into_env(self, env: &mut Env<S>) {
let Self {
aliases,
arg0,
builtins,
exit_status,
functions,
jobs,
main_pgid,
main_pid,
options,
stack,
traps,
tty,
variables,
any,
} = self;
env.aliases = aliases;
env.arg0 = arg0;
env.builtins = builtins;
env.exit_status = exit_status;
env.functions = functions;
env.jobs = jobs;
env.main_pgid = main_pgid;
env.main_pid = main_pid;
env.options = options;
env.stack = stack;
env.traps = traps;
env.tty = tty;
env.variables = variables;
env.any = any;
}
#[must_use]
pub fn into_env_with_system(self, system: S) -> Env<S> {
Env {
aliases: self.aliases,
arg0: self.arg0,
builtins: self.builtins,
exit_status: self.exit_status,
functions: self.functions,
jobs: self.jobs,
main_pgid: self.main_pgid,
main_pid: self.main_pid,
options: self.options,
stack: self.stack,
traps: self.traps,
tty: self.tty,
variables: self.variables,
any: self.any,
system,
}
}
}
impl<S> Clone for ForkEnvState<S> {
fn clone(&self) -> Self {
Self {
aliases: self.aliases.clone(),
arg0: self.arg0.clone(),
builtins: self.builtins.clone(),
exit_status: self.exit_status,
functions: self.functions.clone(),
jobs: self.jobs.clone(),
main_pgid: self.main_pgid,
main_pid: self.main_pid,
options: self.options,
stack: self.stack.clone(),
traps: self.traps.clone(),
tty: self.tty,
variables: self.variables.clone(),
any: self.any.clone(),
}
}
fn clone_from(&mut self, source: &Self) {
self.aliases.clone_from(&source.aliases);
self.arg0.clone_from(&source.arg0);
self.builtins.clone_from(&source.builtins);
self.exit_status = source.exit_status;
self.functions.clone_from(&source.functions);
self.jobs.clone_from(&source.jobs);
self.main_pgid = source.main_pgid;
self.main_pid = source.main_pid;
self.options = source.options;
self.stack.clone_from(&source.stack);
self.traps.clone_from(&source.traps);
self.tty = source.tty;
self.variables.clone_from(&source.variables);
self.any.clone_from(&source.any);
}
}