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