diff options
Diffstat (limited to 'src/cmd/server.rs')
-rw-r--r-- | src/cmd/server.rs | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/cmd/server.rs b/src/cmd/server.rs index e3f7884..9433e83 100644 --- a/src/cmd/server.rs +++ b/src/cmd/server.rs @@ -1,5 +1,14 @@ +use snafu::ResultExt as _; +use tokio::prelude::*; + #[derive(Debug, snafu::Snafu)] -pub enum Error {} +pub enum Error { + #[snafu(display("failed to parse address: {}", source))] + ParseAddress { source: std::net::AddrParseError }, + + #[snafu(display("failed to bind: {}", source))] + Bind { source: tokio::io::Error }, +} pub type Result<T> = std::result::Result<T, Error>; @@ -7,6 +16,22 @@ pub fn cmd<'a, 'b>(app: clap::App<'a, 'b>) -> clap::App<'a, 'b> { app.about("Run a termcast server") } -pub fn run<'a>(matches: &clap::ArgMatches<'a>) -> super::Result<()> { - unimplemented!() +pub fn run<'a>(_matches: &clap::ArgMatches<'a>) -> super::Result<()> { + run_impl().context(super::Server) +} + +fn run_impl() -> Result<()> { + let addr = "127.0.0.1:8000".parse().context(ParseAddress)?; + let listener = tokio::net::TcpListener::bind(&addr).context(Bind)?; + let server = listener + .incoming() + .for_each(|_sock| { + println!("got a connection"); + Ok(()) + }) + .map_err(|e| { + eprintln!("accept failed: {}", e); + }); + tokio::run(server); + Ok(()) } |