simdjson_rust/dom/
parser.rs

1use std::ptr::NonNull;
2
3use ffi::DEFAULT_BATCH_SIZE;
4use simdjson_sys as ffi;
5
6use super::{document::Document, document_stream::DocumentStream, element::Element};
7use crate::{
8    macros::{impl_drop, map_ptr_result},
9    Result,
10};
11
12pub struct Parser {
13    ptr: NonNull<ffi::SJ_DOM_parser>,
14}
15
16impl Default for Parser {
17    fn default() -> Self {
18        Self::new(ffi::SIMDJSON_MAXSIZE_BYTES)
19    }
20}
21
22impl Parser {
23    pub fn new(max_capacity: usize) -> Self {
24        let ptr = unsafe { NonNull::new_unchecked(ffi::SJ_DOM_parser_new(max_capacity)) };
25        Self { ptr }
26    }
27
28    pub fn parse(&mut self, padded_string: &String) -> Result<Element> {
29        map_ptr_result!(ffi::SJ_DOM_parser_parse(
30            self.ptr.as_ptr(),
31            padded_string.as_ptr().cast(),
32            padded_string.len()
33        ))
34        .map(Element::new)
35    }
36
37    pub fn parse_into_document<'d>(
38        &self,
39        doc: &'d mut Document,
40        padded_string: &String,
41    ) -> Result<Element<'d>> {
42        map_ptr_result!(ffi::SJ_DOM_parser_parse_into_document(
43            self.ptr.as_ptr(),
44            doc.as_ptr(),
45            padded_string.as_ptr().cast(),
46            padded_string.len()
47        ))
48        .map(Element::new)
49    }
50
51    pub fn parse_many(&mut self, padded_string: &String) -> Result<DocumentStream> {
52        self.parse_batch(padded_string, DEFAULT_BATCH_SIZE)
53    }
54
55    pub fn parse_batch(
56        &mut self,
57        padded_string: &String,
58        batch_size: usize,
59    ) -> Result<DocumentStream> {
60        map_ptr_result!(ffi::SJ_DOM_parser_parse_many(
61            self.ptr.as_ptr(),
62            padded_string.as_ptr().cast(),
63            padded_string.len(),
64            batch_size
65        ))
66        .map(DocumentStream::new)
67    }
68}
69
70impl_drop!(Parser, ffi::SJ_DOM_parser_free);
71
72#[cfg(test)]
73mod tests {
74    use super::*;
75    use crate::prelude::*;
76
77    #[test]
78    fn parse() {
79        let ps = "1".to_padded_string();
80        let mut parser = Parser::default();
81        let elem = parser.parse(&ps).unwrap();
82        assert_eq!(elem.get_uint64().unwrap(), 1);
83    }
84
85    #[test]
86    fn parse_into_document() {
87        let ps = "[1,2,3]".to_padded_string();
88        let parser = Parser::default();
89        let mut doc = Document::default();
90        let elem = parser.parse_into_document(&mut doc, &ps).unwrap();
91        assert_eq!(
92            elem.get_array()
93                .unwrap()
94                .at(0)
95                .unwrap()
96                .get_uint64()
97                .unwrap(),
98            1
99        );
100    }
101}