aboutsummaryrefslogtreecommitdiffstats
path: root/src/cmd/stream.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/stream.rs')
-rw-r--r--src/cmd/stream.rs127
1 files changed, 32 insertions, 95 deletions
diff --git a/src/cmd/stream.rs b/src/cmd/stream.rs
index 809e480..14f4fac 100644
--- a/src/cmd/stream.rs
+++ b/src/cmd/stream.rs
@@ -1,41 +1,10 @@
use crate::prelude::*;
use tokio::io::AsyncWrite as _;
-#[derive(serde::Deserialize, Debug)]
+#[derive(serde::Deserialize, Debug, Default)]
pub struct Config {
- #[serde(
- deserialize_with = "crate::config::auth",
- default = "crate::config::default_auth"
- )]
- auth: crate::protocol::Auth,
-
- #[serde(
- deserialize_with = "crate::config::connect_address",
- default = "crate::config::default_connect_address"
- )]
- connect_address: (String, std::net::SocketAddr),
-
- #[serde(default = "crate::config::default_tls")]
- tls: bool,
-
- #[serde(default = "crate::config::default_connection_buffer_size")]
- buffer_size: usize,
-
- #[serde(skip, default = "crate::config::default_command")]
- command: String,
-
- #[serde(skip, default = "crate::config::default_args")]
- args: Vec<String>,
-}
-
-impl Config {
- fn host(&self) -> &str {
- &self.connect_address.0
- }
-
- fn addr(&self) -> &std::net::SocketAddr {
- &self.connect_address.1
- }
+ client: crate::config::Client,
+ command: crate::config::Command,
}
impl crate::config::Config for Config {
@@ -43,52 +12,33 @@ impl crate::config::Config for Config {
&mut self,
matches: &clap::ArgMatches<'a>,
) -> Result<()> {
- if matches.is_present("login-recurse-center") {
- let id = crate::oauth::load_client_auth_id(
- crate::protocol::AuthType::RecurseCenter,
- );
- self.auth = crate::protocol::Auth::recurse_center(
- id.as_ref().map(std::string::String::as_str),
- );
- }
- if matches.is_present("login-plain") {
- let username =
- matches.value_of("login-plain").unwrap().to_string();
- self.auth = crate::protocol::Auth::plain(&username);
- }
- if matches.is_present("address") {
- let address = matches.value_of("address").unwrap();
- self.connect_address =
- crate::config::to_connect_address(address)?;
- }
- if matches.is_present("tls") {
- self.tls = true;
- }
- if matches.is_present("buffer-size") {
- let buffer_size = matches.value_of("buffer-size").unwrap();
- self.buffer_size = buffer_size.parse().context(
- crate::error::ParseBufferSize { input: buffer_size },
- )?;
- }
- if matches.is_present("command") {
- self.command = matches.value_of("command").unwrap().to_string();
- }
- if matches.is_present("args") {
- self.args = matches
- .values_of("args")
- .unwrap()
- .map(std::string::ToString::to_string)
- .collect();
- }
+ self.client.merge_args(matches)?;
+ self.command.merge_args(matches)?;
Ok(())
}
fn run(&self) -> Result<()> {
- let host = self.host().to_string();
- let address = *self.addr();
+ let host = self.client.host().to_string();
+ let address = *self.client.addr();
+ let auth = match self.client.auth {
+ crate::protocol::AuthType::Plain => {
+ let username = self
+ .client
+ .username
+ .clone()
+ .context(crate::error::CouldntFindUsername)?;
+ crate::protocol::Auth::plain(&username)
+ }
+ crate::protocol::AuthType::RecurseCenter => {
+ let id = crate::oauth::load_client_auth_id(self.client.auth);
+ crate::protocol::Auth::recurse_center(
+ id.as_ref().map(std::string::String::as_str),
+ )
+ }
+ };
let fut: Box<
dyn futures::future::Future<Item = (), Error = Error> + Send,
- > = if self.tls {
+ > = if self.client.tls {
let connector = native_tls::TlsConnector::new()
.context(crate::error::CreateConnector)?;
let connect: crate::client::Connector<_> = Box::new(move || {
@@ -107,11 +57,11 @@ impl crate::config::Config for Config {
)
});
Box::new(StreamSession::new(
- &self.command,
- &self.args,
+ &self.command.command,
+ &self.command.args,
connect,
- self.buffer_size,
- &self.auth,
+ self.command.buffer_size,
+ &auth,
))
} else {
let connect: crate::client::Connector<_> = Box::new(move || {
@@ -121,11 +71,11 @@ impl crate::config::Config for Config {
)
});
Box::new(StreamSession::new(
- &self.command,
- &self.args,
+ &self.command.command,
+ &self.command.args,
connect,
- self.buffer_size,
- &self.auth,
+ self.command.buffer_size,
+ &auth,
))
};
tokio::run(fut.map_err(|e| {
@@ -135,19 +85,6 @@ impl crate::config::Config for Config {
}
}
-impl Default for Config {
- fn default() -> Self {
- Self {
- auth: crate::config::default_auth(),
- connect_address: crate::config::default_connect_address(),
- tls: crate::config::default_tls(),
- buffer_size: crate::config::default_connection_buffer_size(),
- command: crate::config::default_command(),
- args: crate::config::default_args(),
- }
- }
-}
-
pub fn cmd<'a, 'b>(app: clap::App<'a, 'b>) -> clap::App<'a, 'b> {
app.about("Stream your terminal")
.arg(