diff options
Diffstat (limited to 'src/request.rs')
| -rw-r--r-- | src/request.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/request.rs b/src/request.rs new file mode 100644 index 0000000..2814a14 --- /dev/null +++ b/src/request.rs @@ -0,0 +1,55 @@ + +use mlua::UserData; + +use tokio::io::{self}; + +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("error parsing request: {0}")] + Parse(#[from] httparse::Error), + + #[error("io error: {0}")] + Io(#[from] io::Error), + + #[error("invalid method: {0}")] + Method(#[from] http::method::InvalidMethod), + + #[error("invalid request: {0}")] + Request(#[from] http::Error), + + #[error("unsupported version")] + Version, +} + +#[derive(Debug, Clone)] +pub struct Request<T>(http::Request<T>); + +impl<T> Request<T> { + pub fn inner(&self) -> &http::Request<T> { + &self.0 + } + + pub fn new(request: http::Request<T>) -> Self { + Self(request) + } +} + +impl<T> UserData for Request<T> { + fn add_fields<F: mlua::UserDataFields<Self>>(fields: &mut F) { + fields.add_field_method_get("method", |_, this| { + Ok(this.inner().method().as_str().to_string()) + }); + + fields.add_field_method_get("path", |_, this| Ok(this.inner().uri().path().to_string())); + + fields.add_field_method_get("headers", |lua, this| { + let table = lua.create_table()?; + + for (key, value) in this.inner().headers() { + table.set(key.as_str(), value.as_bytes())?; + } + + Ok(table) + }) + } +} |
