Skip to main content

sark_json/
lib.rs

1use http::StatusCode;
2use sark_core::http::Response;
3
4mod body;
5mod encode;
6mod error;
7mod parse;
8mod scan;
9mod scratch;
10mod traits;
11
12pub use body::InlineToken;
13pub use encode::{Encode, Writer};
14pub use parse::Parse;
15pub use scan::Scan;
16pub use scratch::Scratch;
17pub use traits::{JsonDecode, JsonEncode, JsonPreserve, JsonScan};
18
19pub type Result<T> = sark_core::error::Result<T>;
20
21pub struct Json;
22
23impl Json {
24    pub fn ok<T: JsonEncode>(value: T) -> Response {
25        Self::status(StatusCode::OK, value)
26    }
27
28    pub fn ok_preserve<T: JsonEncode + JsonPreserve>(value: T) -> Response {
29        Self::status_preserve(StatusCode::OK, value)
30    }
31
32    pub fn status<T: JsonEncode>(status: StatusCode, value: T) -> Response {
33        let body = value.encode_json();
34        let mut response = Response::new(status);
35        response.content_type("application/json");
36        response.set_body(body);
37        response
38    }
39
40    pub fn status_preserve<T: JsonEncode + JsonPreserve>(status: StatusCode, value: T) -> Response {
41        let body = if let Some(raw) = value.raw_json() {
42            raw.clone()
43        } else {
44            value.encode_json().freeze()
45        };
46        let mut response = Response::new(status);
47        response.content_type("application/json");
48        response.set_body(body);
49        response
50    }
51
52    pub fn bad_request(msg: impl Into<String>) -> sark_core::error::Error {
53        error::Fail::with(msg)
54    }
55}