simdjson_rust/dom/
parser.rs1use 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}