summaryrefslogtreecommitdiff
path: root/src/response.rs
diff options
context:
space:
mode:
authorJohn Turner <jturner.usa@gmail.com>2026-03-06 19:56:32 -0500
committerJohn Turner <jturner.usa@gmail.com>2026-03-06 19:56:32 -0500
commit8ebc635c7e659e3a5fdbde48e4e3f66184230c46 (patch)
tree00d752615ac50e794447dc58e5cb1cbb1d266d31 /src/response.rs
parentfb2c9f640dbb493f7d8de16498bf673a82e019a4 (diff)
downloadhttpd-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.rs51
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")),
+ }
+ }
+}