simdjson_rust/ondemand/
parser.rs1use 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 let arr = doc.get_array().unwrap();
57 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}