use crate::bindings::vtx::api::vtx_types::{HttpRequest, HttpResponse};
use crate::error::VtxError;
use crate::modules::io::fs;
pub type Request = HttpRequest;
pub type Response = HttpResponse;
pub struct ResponseBuilder;
impl ResponseBuilder {
pub fn json<T: serde::Serialize>(data: &T) -> Response {
let json_bytes = serde_json::to_vec(data).unwrap_or_else(|_| b"[]".to_vec());
let buffer = fs::create_memory_buffer(&json_bytes);
HttpResponse {
status: 200,
body: Some(buffer),
}
}
pub fn error(err: VtxError) -> Response {
let (status, message) = match &err {
VtxError::AuthDenied(code) => (*code, format!("Authentication failed: {}", err)),
VtxError::NotFound(msg) => (404, msg.clone()),
VtxError::PermissionDenied(msg) => (403, msg.clone()),
VtxError::SerializationError(msg) => (400, format!("Bad Request: {}", msg)),
VtxError::DatabaseError(msg) => (500, format!("Database Error: {}", msg)),
VtxError::Internal(msg) => (500, format!("Internal Error: {}", msg)),
};
let error_body = serde_json::json!({
"success": false, "error": true, "code": status, "type": format!("{:?}", err), "message": message });
let mut resp = Self::json(&error_body);
resp.status = status;
resp
}
pub fn file(uri: &str) -> Response {
match fs::open_uri(uri) {
Ok(buffer) => HttpResponse {
status: 200,
body: Some(buffer),
},
Err(e) => Self::error(VtxError::NotFound(format!("File not found: {}", e))),
}
}
pub fn status(code: u16) -> Response {
HttpResponse {
status: code,
body: None,
}
}
pub fn not_found() -> Response {
Self::status(404)
}
}