multi-ssh/src/environment.rs

81 lines
1.9 KiB
Rust
Raw Normal View History

use crate::shell_interface::{
build_command_from_shell_command, CommandOutput, CommandResult, ExitStatus, ShellCommand,
ShellInterface, StartError,
};
use std::env::VarError;
use std::ffi::{OsStr, OsString};
use std::path::PathBuf;
2025-02-04 23:09:02 +01:00
use std::{env, io};
pub trait Environment {
fn args_os(&self) -> Vec<OsString>;
fn var<K>(&self, key: K) -> Result<String, VarError>
where
K: AsRef<OsStr>;
2025-02-04 23:09:02 +01:00
fn set_var<K, V>(&mut self, key: K, value: V)
where
K: AsRef<OsStr>,
V: AsRef<OsStr>;
fn get_home_directory(&self) -> Option<PathBuf>;
2025-02-04 23:09:02 +01:00
fn read_line(&mut self) -> Result<String, io::Error>;
}
#[derive(Debug, Default)]
pub struct Prod;
impl Environment for Prod {
fn args_os(&self) -> Vec<OsString> {
env::args_os().collect()
}
fn var<K>(&self, key: K) -> Result<String, VarError>
where
K: AsRef<OsStr>,
{
env::var(key)
}
2025-02-04 23:09:02 +01:00
fn set_var<K, V>(&mut self, key: K, value: V)
where
K: AsRef<OsStr>,
V: AsRef<OsStr>,
{
env::set_var(key, value);
}
fn get_home_directory(&self) -> Option<PathBuf> {
homedir::my_home().ok().flatten()
}
2025-02-04 23:09:02 +01:00
fn read_line(&mut self) -> Result<String, io::Error> {
let mut buffer = String::new();
io::stdin().read_line(&mut buffer)?;
Ok(buffer.trim().to_string())
}
}
impl ShellInterface for Prod {
fn run_command(&mut self, command: ShellCommand) -> CommandResult<ExitStatus, StartError> {
CommandResult {
result: build_command_from_shell_command(&command)
.status()
.map(ExitStatus::from)
.map_err(StartError::from),
command,
}
}
fn collect_command_output(
&mut self,
command: ShellCommand,
) -> CommandResult<CommandOutput, StartError> {
CommandResult {
result: build_command_from_shell_command(&command)
.output()
.map(CommandOutput::from)
.map_err(StartError::from),
command,
}
}
}