Skip to main content

sark_json/
lib.rs

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