From 5cce5a618ca98a108586de5b979d1e6d67ba7dbf Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Thu, 23 Jul 2020 22:32:30 -0400 Subject: [PATCH] haha it works --- src/lib.rs | 13 +------------ src/response.rs | 33 +++++++++++++++++++++++++++++---- src/status_code.rs | 2 +- testdata/error_response.txt | 1 + testdata/notfound_response.txt | 1 + 5 files changed, 33 insertions(+), 17 deletions(-) create mode 100644 testdata/error_response.txt create mode 100644 testdata/notfound_response.txt diff --git a/src/lib.rs b/src/lib.rs index 36855f0..6878d34 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,16 +1,5 @@ -#[macro_use] -extern crate num_derive; - mod status_code; mod response; pub use status_code::StatusCode; -pub use response::Response; - -#[cfg(test)] -mod tests { - #[test] - fn it_works() { - assert_eq!(2 + 2, 4); - } -} +pub use response::{Response, Error as ResponseError}; diff --git a/src/response.rs b/src/response.rs index 0aea72e..ec2544a 100644 --- a/src/response.rs +++ b/src/response.rs @@ -19,6 +19,7 @@ enum State { ReadBody { data: Vec }, } +/// Response parsing error. #[derive(thiserror::Error, Debug)] pub enum Error { #[error("unexpected end of file found while parsing response")] @@ -60,7 +61,7 @@ impl Response { Err(why) => return Err(Error::IO(why)), } - log::trace!("state: {:?}", state); + // log::trace!("state: {:?}", state); match &mut state { State::ReadStatusCode { data } => match buf[0] as char { @@ -105,11 +106,35 @@ mod tests { use std::io::prelude::*; #[test] - fn parse() -> Result<(), Error> { - pretty_env_logger::init(); + fn success() -> Result<(), Error> { + let _ = pretty_env_logger::try_init(); let mut fin = std::fs::File::open("./testdata/simple_response.txt")?; - Response::parse(&mut fin)?; + let resp = Response::parse(&mut fin)?; + assert_eq!(resp.meta, "text/gemini".to_string()); + assert_eq!(resp.status, StatusCode::Success); + + Ok(()) + } + + #[test] + fn error() -> Result<(), Error> { + let _ = pretty_env_logger::try_init(); + let mut fin = std::fs::File::open("./testdata/error_response.txt")?; + + let resp = Response::parse(&mut fin)?; + assert_eq!(resp.status, StatusCode::PermanentFailure); + + Ok(()) + } + + #[test] + fn not_found() -> Result<(), Error> { + let _ = pretty_env_logger::try_init(); + let mut fin = std::fs::File::open("./testdata/notfound_response.txt")?; + + let resp = Response::parse(&mut fin)?; + assert_eq!(resp.status, StatusCode::NotFound); Ok(()) } diff --git a/src/status_code.rs b/src/status_code.rs index c742848..62204b3 100644 --- a/src/status_code.rs +++ b/src/status_code.rs @@ -1,5 +1,5 @@ /// Status codes as specified in [the spec](https://gemini.circumlunar.space/docs/specification.html). -#[derive(Copy, Clone, num_derive::FromPrimitive)] +#[derive(Copy, Clone, num_derive::FromPrimitive, PartialEq, Debug)] pub enum StatusCode { /// The requested resource accepts a line of textual user input. /// The line is a prompt which should be displayed to the diff --git a/testdata/error_response.txt b/testdata/error_response.txt new file mode 100644 index 0000000..7cd7c4c --- /dev/null +++ b/testdata/error_response.txt @@ -0,0 +1 @@ +50 oh god everything is on fire diff --git a/testdata/notfound_response.txt b/testdata/notfound_response.txt new file mode 100644 index 0000000..f987f88 --- /dev/null +++ b/testdata/notfound_response.txt @@ -0,0 +1 @@ +51 Not found!