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