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