Skip to main content

ferro_rs/http/
mod.rs

1pub mod action;
2mod body;
3pub mod cookie;
4mod extract;
5mod form_request;
6mod multipart;
7mod request;
8pub mod request_context;
9/// API resource and pagination types.
10pub mod resources;
11mod response;
12pub mod sse;
13
14pub use action::{
15    ActionError, ActionKind, ActionResult, ActionResultExt, FlashVariant, IntoActionError,
16};
17pub use body::{collect_body, parse_form, parse_json, FerroBody};
18pub use cookie::{parse_cookies, Cookie, CookieOptions, SameSite};
19pub use extract::{FromParam, FromRequest};
20pub use form_request::FormRequest;
21pub use multipart::{validate_mime, validate_size, MultipartForm, UploadedFile};
22pub use request::{Request, RequestParts};
23pub use request_context::request_host;
24pub use resources::{PaginationLinks, PaginationMeta, Resource, ResourceCollection, ResourceMap};
25pub use response::{
26    HttpResponse, InertiaRedirect, Redirect, RedirectRouteBuilder, Response, ResponseExt,
27};
28pub use sse::{SseEvent, SseStream};
29
30/// Error type for missing route parameters
31///
32/// This type is kept for backward compatibility. New code should use
33/// `FrameworkError::param()` instead.
34#[derive(Debug)]
35pub struct ParamError {
36    /// Name of the missing route parameter.
37    pub param_name: String,
38}
39
40impl From<ParamError> for HttpResponse {
41    fn from(err: ParamError) -> HttpResponse {
42        HttpResponse::json(serde_json::json!({
43            "error": format!("Missing required parameter: {}", err.param_name)
44        }))
45        .status(400)
46    }
47}
48
49impl From<ParamError> for crate::error::FrameworkError {
50    fn from(err: ParamError) -> crate::error::FrameworkError {
51        crate::error::FrameworkError::ParamError {
52            param_name: err.param_name,
53        }
54    }
55}
56
57impl From<ParamError> for Response {
58    fn from(err: ParamError) -> Response {
59        Err(HttpResponse::from(crate::error::FrameworkError::from(err)))
60    }
61}
62
63/// Create a text response
64pub fn text(body: impl Into<String>) -> Response {
65    Ok(HttpResponse::text(body))
66}
67
68/// Create a JSON response from a serde_json::Value
69pub fn json(body: serde_json::Value) -> Response {
70    Ok(HttpResponse::json(body))
71}
72
73/// Create a binary response from raw bytes.
74///
75/// No default Content-Type is set; add one via `.header()` on the inner `HttpResponse`.
76pub fn bytes(body: impl Into<bytes::Bytes>) -> Response {
77    Ok(HttpResponse::bytes(body))
78}