simdjson_rust/ondemand/
parser.rs

1use std::ptr::NonNull;
2
3use simdjson_sys as ffi;
4
5use super::document::Document;
6use crate::{
7    error::Result,
8    macros::{impl_drop, map_result},
9};
10
11pub struct Parser {
12    ptr: NonNull<ffi::SJ_OD_parser>,
13}
14
15impl Default for Parser {
16    fn default() -> Self {
17        Parser::new(ffi::SIMDJSON_MAXSIZE_BYTES)
18    }
19}
20
21impl Parser {
22    pub fn new(max_capacity: usize) -> Self {
23        let ptr = unsafe { NonNull::new_unchecked(ffi::SJ_OD_parser_new(max_capacity)) };
24        Self { ptr }
25    }
26
27    pub fn iterate<'p, 's>(&'p mut self, padded_string: &'s String) -> Result<Document<'p, 's>> {
28        map_result!(
29            ffi::SJ_OD_parser_iterate_padded_string_view(
30                self.ptr.as_mut(),
31                padded_string.as_ptr().cast(),
32                padded_string.len(),
33                padded_string.capacity()
34            ),
35            ffi::SJ_OD_document_result_error,
36            ffi::SJ_OD_document_result_value_unsafe
37        )
38        .map(Document::new)
39    }
40}
41
42impl_drop!(Parser, ffi::SJ_OD_parser_free);
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47    use crate::padded_string::make_padded_string;
48
49    #[test]
50    fn test_new() {
51        let mut parser = Parser::default();
52        let ps = make_padded_string("[1,2,3]");
53        let mut doc = parser.iterate(&ps).unwrap();
54        // drop(ps);
55        // doc.get_array().unwrap();
56        let arr = doc.get_array().unwrap();
57        // drop(doc);
58        // for v in arr.iter().unwrap() {
59        //     let _ = v.unwrap().get_uint64().unwrap();
60        // }
61        // doc.get_value().unwrap();
62
63        drop(arr);
64        drop(doc);
65
66        let ps2 = make_padded_string("1");
67        let mut doc2 = parser.iterate(&ps2).unwrap();
68        let v = doc2.get_int64().unwrap();
69        assert_eq!(v, 1);
70        let v = doc2.get_uint64().unwrap();
71        assert_eq!(v, 1);
72    }
73}