haystack_server/ops/
formats.rs1use actix_web::{HttpRequest, HttpResponse, web};
21
22use haystack_core::data::{HCol, HDict, HGrid};
23use haystack_core::kinds::Kind;
24
25use crate::content;
26use crate::state::AppState;
27
28pub async fn handle(req: HttpRequest, _state: web::Data<AppState>) -> HttpResponse {
34 let accept = req
35 .headers()
36 .get("Accept")
37 .and_then(|v| v.to_str().ok())
38 .unwrap_or("");
39
40 let formats = vec![
41 ("text/zinc", "Zinc"),
42 ("application/json", "JSON (Haystack 4)"),
43 ("text/trio", "Trio"),
44 ("application/json;v=3", "JSON (Haystack 3)"),
45 ];
46
47 let cols = vec![HCol::new("mime"), HCol::new("receive"), HCol::new("send")];
48 let rows: Vec<HDict> = formats
49 .into_iter()
50 .map(|(mime, _label)| {
51 let mut row = HDict::new();
52 row.set("mime", Kind::Str(mime.to_string()));
53 row.set("receive", Kind::Marker);
54 row.set("send", Kind::Marker);
55 row
56 })
57 .collect();
58
59 let grid = HGrid::from_parts(HDict::new(), cols, rows);
60 match content::encode_response_grid(&grid, accept) {
61 Ok((body, ct)) => HttpResponse::Ok().content_type(ct).body(body),
62 Err(e) => {
63 log::error!("Failed to encode formats grid: {e}");
64 HttpResponse::InternalServerError().body("encoding error")
65 }
66 }
67}