(* TODO response use ErrorDetail *) let respond_json req content status = let open Vif.Response in let open Syntax in let* () = add ~field:"content-type" "application/json" in let* () = with_string req content in respond status let mk_error_content ?hint _status = let open Api in let code = -1 in let err = ErrorDetail.make ?hint code in encode_exn ErrorDetail.jsont err let error ~hint req = Logs.err (fun m -> m "internal server error: %s" hint); let body = mk_error_content ~hint `Internal_server_error in respond_json req body `Internal_server_error let bad_request ?hint req = Logs.err (fun m -> m "bad request"); let body = mk_error_content ?hint `Bad_request in respond_json req body `Bad_request let unsupported_media_type req = Logs.err (fun m -> m "unsupported media type"); let open Vif.Response in let open Syntax in let* () = add ~field:"accept" Headers.accept_header_value in let* () = add ~field:"avail-languages" Headers.avail_languages_header_value in let body = mk_error_content `Unsupported_media_type in respond_json req body `Unsupported_media_type let ok content req = Logs.debug (fun m -> m "ok"); respond_json req content `OK let not_modified () = Logs.debug (fun m -> m "not modified"); let open Vif.Response in let open Syntax in let* () = empty in respond `Not_modified let result res req = match res with Error hint -> error ~hint req | Ok content -> ok content req