diff options
| author | John Turner <jturner.usa@gmail.com> | 2026-03-06 19:56:32 -0500 |
|---|---|---|
| committer | John Turner <jturner.usa@gmail.com> | 2026-03-06 19:56:32 -0500 |
| commit | 8ebc635c7e659e3a5fdbde48e4e3f66184230c46 (patch) | |
| tree | 00d752615ac50e794447dc58e5cb1cbb1d266d31 /src/response.rs | |
| parent | fb2c9f640dbb493f7d8de16498bf673a82e019a4 (diff) | |
| download | httpd-8ebc635c7e659e3a5fdbde48e4e3f66184230c46.tar.gz | |
remove rust level handlers, responses will not be generated in lua
Diffstat (limited to 'src/response.rs')
| -rw-r--r-- | src/response.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/response.rs b/src/response.rs index 68189fb..f6f0fa0 100644 --- a/src/response.rs +++ b/src/response.rs @@ -2,6 +2,8 @@ mod builder; use get::Get; +use mlua::{FromLua, Lua, Value}; + use std::collections::HashMap; use tokio::{ @@ -13,6 +15,8 @@ use strum::{Display, EnumString, FromRepr}; use builder::Builder; +use crate::lua; + #[allow(unreachable_patterns)] #[derive(Debug, Clone, Copy, Display, EnumString, FromRepr)] pub enum Status { @@ -80,3 +84,50 @@ impl Response { Ok(()) } } + +impl FromLua for Response { + fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> { + match value { + Value::Table(table) => { + let status = match table.get("status")? { + Value::Integer(i) => match Status::from_repr(i as usize) { + Some(status) => status, + None => return Err(mlua::Error::runtime(format!("invalid status: {i}"))), + }, + _ => return Err(mlua::Error::runtime("invalid status")), + }; + + let headers = match table.get("headers")? { + Value::Table(table) => { + let mut headers = HashMap::new(); + + for result in table.pairs() { + let (key, value): (String, mlua::String) = result?; + + headers.insert(key, value.as_bytes().to_vec()); + } + + headers + } + Value::Nil => HashMap::new(), + _ => return Err(mlua::Error::runtime("invalid headers")), + }; + + let body = match table.get("body")? { + Value::String(string) => Body::Buffer(string.as_bytes().to_vec()), + Value::UserData(userdata) if userdata.is::<lua::File>() => { + Body::File(userdata.borrow_mut::<lua::File>().unwrap().take().unwrap()) + } + _ => return Err(mlua::Error::runtime("invalid body")), + }; + + Ok(Self { + status, + headers, + body, + }) + } + _ => Err(mlua::Error::runtime("invalid response, expected a table")), + } + } +} |
