1use crate::bindings::vtx::api::{
4 stream_io,
5 types::{HttpRequest, HttpResponse},
6};
7use crate::error::VtxError;
8
9pub type Request = HttpRequest;
11pub type Response = HttpResponse;
12
13pub struct ResponseBuilder;
22
23impl ResponseBuilder {
24 pub fn json<T: serde::Serialize>(data: &T) -> Response {
28 let json_bytes = serde_json::to_vec(data).unwrap_or_else(|_| b"[]".to_vec());
29
30 let buffer = stream_io::create_memory_buffer(&json_bytes);
32 HttpResponse {
33 status: 200,
34 body: Some(buffer),
35 }
36 }
37
38 pub fn error(err: VtxError) -> Response {
57 let (status, message) = match &err {
58 VtxError::AuthDenied(code) => (*code, format!("Authentication failed: {}", err)),
59 VtxError::NotFound(msg) => (404, msg.clone()),
60 VtxError::PermissionDenied(msg) => (403, msg.clone()),
61 VtxError::SerializationError(msg) => (400, format!("Bad Request: {}", msg)),
62 VtxError::DatabaseError(msg) => (500, format!("Database Error: {}", msg)),
63 VtxError::Internal(msg) => (500, format!("Internal Error: {}", msg)),
64 };
65
66 let error_body = serde_json::json!({
67 "success": false, "error": true, "code": status, "type": format!("{:?}", err), "message": message });
73
74 let mut resp = Self::json(&error_body);
75 resp.status = status;
76 resp
77 }
78
79 pub fn file(uuid: &str) -> Response {
84 match stream_io::open_file(uuid) {
85 Ok(buffer) => HttpResponse {
86 status: 200,
87 body: Some(buffer),
88 },
89 Err(e) => Self::error(VtxError::NotFound(format!("File UUID not found: {}", e))),
90 }
91 }
92
93 pub fn status(code: u16) -> Response {
97 HttpResponse {
98 status: code,
99 body: None,
100 }
101 }
102
103 pub fn not_found() -> Response {
105 Self::status(404)
106 }
107}