Skip to content

Commit

Permalink
update at_pointer
Browse files Browse the repository at this point in the history
  • Loading branch information
SunDoge committed Aug 24, 2023
1 parent 426a4f1 commit 440347a
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 44 deletions.
6 changes: 3 additions & 3 deletions examples/issue_20.rs

Large diffs are not rendered by default.

20 changes: 7 additions & 13 deletions examples/quickstart.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
use simdjson_rust::{ondemand::parser::Parser, padded_string::load_padded_string, Result};
use simdjson_rust::{ondemand, prelude::*, Result};

fn main() -> Result<()> {
// let mut parser = dom::Parser::default();
// let tweets = parser.load("json-examples/twitter.json")?;
// println!(
// "{} results.",
// tweets
// .at_key("search_metadata")?
// .at_key("count")?
// .get_u64()?
// );

let ps = load_padded_string("simdjson-sys/simdjson/jsonexamples/twitter.json")?;
let mut parser = Parser::default();
let _tweets = parser.iterate(&ps)?;
let mut parser = ondemand::Parser::default();
let mut tweets = parser.iterate(&ps)?;
println!(
"{} results.",
tweets.at_pointer("/search_metadata/count")?.get_uint64()?
);

Ok(())
}
4 changes: 2 additions & 2 deletions examples/simple.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use simdjson_rust::{ondemand::parser::Parser, padded_string::make_padded_string, Result};
use simdjson_rust::{ondemand::Parser, prelude::*};

fn main() -> Result<()> {
fn main() -> simdjson_rust::Result<()> {
let mut parser = Parser::default();
let ps = make_padded_string("[0,1,2,3]");
let mut doc = parser.iterate(&ps)?;
Expand Down
27 changes: 14 additions & 13 deletions simdjson-sys/src/simdjson_c_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@ template <typename U, typename T> inline U object_to_pointer(T &&t) {
return std::move(*result).value_unsafe(); \
}

#define IMPL_AT_POINTER(self, type) \
SJ_OD_value_result *self##_at_pointer(self *self, const char *s, \
size_t len) { \
auto result = \
reinterpret_cast<type *>(self)->at_pointer(std::string_view(s, len)); \
return object_to_pointer<SJ_OD_value_result *>(std::move(result)); \
}

// IMPL_CLASS(SJ_padded_string, padded_string)
// IMPL_RESULT(SJ_padded_string, padded_string)
IMPL_CLASS(SJ_OD_parser, ondemand::parser)
Expand Down Expand Up @@ -117,6 +125,7 @@ SJ_OD_value_result *SJ_OD_document_get_value(SJ_OD_document *doc) {
return object_to_pointer<value##_result *>(std::move(result)); \
}

// ondemand::value
IMPL_GET(SJ_OD_value, ondemand::value, SJ_OD_object, get_object)
IMPL_GET(SJ_OD_value, ondemand::value, SJ_OD_array, get_array)
IMPL_GET(SJ_OD_value, ondemand::value, uint64_t, get_uint64)
Expand All @@ -125,7 +134,9 @@ IMPL_GET(SJ_OD_value, ondemand::value, double, get_double)
IMPL_GET(SJ_OD_value, ondemand::value, SJ_OD_raw_json_string,
get_raw_json_string)
IMPL_GET(SJ_OD_value, ondemand::value, STD_string_view, get_wobbly_string)
IMPL_AT_POINTER(SJ_OD_value, ondemand::value)

// ondemand::document
IMPL_GET(SJ_OD_document, ondemand::document, SJ_OD_object, get_object)
IMPL_GET(SJ_OD_document, ondemand::document, SJ_OD_array, get_array)
IMPL_GET(SJ_OD_document, ondemand::document, uint64_t, get_uint64)
Expand All @@ -134,6 +145,7 @@ IMPL_GET(SJ_OD_document, ondemand::document, double, get_double)
IMPL_GET(SJ_OD_document, ondemand::document, SJ_OD_raw_json_string,
get_raw_json_string)
IMPL_GET(SJ_OD_document, ondemand::document, STD_string_view, get_wobbly_string)
IMPL_AT_POINTER(SJ_OD_document, ondemand::document)

STD_string_view_result *SJ_OD_value_get_string(SJ_OD_value *self,
bool allow_replacement) {
Expand Down Expand Up @@ -163,19 +175,13 @@ IMPL_GET(SJ_OD_array, ondemand::array, bool, reset)
IMPL_GET(SJ_OD_array, ondemand::array, SJ_OD_array_iterator, begin)
IMPL_GET(SJ_OD_array, ondemand::array, SJ_OD_array_iterator, end)
IMPL_GET(SJ_OD_array, ondemand::array, STD_string_view, raw_json)
IMPL_AT_POINTER(SJ_OD_array, ondemand::array)

SJ_OD_value_result *SJ_OD_array_at(SJ_OD_array *array, size_t index) {
auto result = reinterpret_cast<ondemand::array *>(array)->at(index);
return object_to_pointer<SJ_OD_value_result *>(std::move(result));
}

SJ_OD_value_result *SJ_OD_array_at_pointer(SJ_OD_array *self, const char *s,
size_t len) {
auto result = reinterpret_cast<ondemand::array *>(self)->at_pointer(
std::string_view(s, len));
return object_to_pointer<SJ_OD_value_result *>(std::move(result));
}

// ondemand::array_iterator
SJ_OD_value_result *SJ_OD_array_iterator_get(SJ_OD_array_iterator *self) {
auto ptr = reinterpret_cast<ondemand::array_iterator *>(self);
Expand All @@ -198,12 +204,7 @@ IMPL_GET(SJ_OD_object, ondemand::object, STD_string_view, raw_json)
IMPL_GET(SJ_OD_object, ondemand::object, bool, is_empty)
IMPL_GET(SJ_OD_object, ondemand::object, bool, reset)
IMPL_GET(SJ_OD_object, ondemand::object, size_t, count_fields)
SJ_OD_value_result *SJ_OD_object_at_pointer(SJ_OD_object *self, const char *s,
size_t len) {
auto result = reinterpret_cast<ondemand::object *>(self)->at_pointer(
std::string_view(s, len));
return object_to_pointer<SJ_OD_value_result *>(std::move(result));
}
IMPL_AT_POINTER(SJ_OD_object, ondemand::object)

SJ_OD_value_result *SJ_OD_object_find_field(SJ_OD_object *object,
const char *data, size_t len) {
Expand Down
13 changes: 9 additions & 4 deletions simdjson-sys/src/simdjson_c_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
#define DEFINE_GET(self, value, method) \
value##_result *self##_##method(self *r);

#define DEFINE_AT_POINTER(self) \
SJ_OD_value_result *self##_at_pointer(self *self, const char *s, size_t len);

#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -81,6 +84,7 @@ DEFINE_GET(SJ_OD_value, SJ_OD_array, get_array)
DEFINE_GET(SJ_OD_value, SJ_OD_object, get_object)
DEFINE_GET(SJ_OD_value, SJ_OD_raw_json_string, get_raw_json_string)
DEFINE_GET(SJ_OD_value, STD_string_view, get_wobbly_string)
DEFINE_AT_POINTER(SJ_OD_value)

// ondemand::document
SJ_OD_value_result *SJ_OD_document_get_value(SJ_OD_document *doc);
Expand All @@ -92,6 +96,7 @@ DEFINE_GET(SJ_OD_document, SJ_OD_array, get_array)
DEFINE_GET(SJ_OD_document, SJ_OD_object, get_object)
DEFINE_GET(SJ_OD_document, SJ_OD_raw_json_string, get_raw_json_string)
DEFINE_GET(SJ_OD_document, STD_string_view, get_wobbly_string)
DEFINE_AT_POINTER(SJ_OD_document)

// get_string is special.
STD_string_view_result *SJ_OD_value_get_string(SJ_OD_value *value,
Expand All @@ -109,9 +114,9 @@ DEFINE_GET(SJ_OD_array, bool, reset)
DEFINE_GET(SJ_OD_array, SJ_OD_array_iterator, begin)
DEFINE_GET(SJ_OD_array, SJ_OD_array_iterator, end)
DEFINE_GET(SJ_OD_array, STD_string_view, raw_json)
DEFINE_AT_POINTER(SJ_OD_array)

SJ_OD_value_result *SJ_OD_array_at(SJ_OD_array *array, size_t index);
SJ_OD_value_result *SJ_OD_array_at_pointer(SJ_OD_array *self, const char *s,
size_t len);

// ondemand::array_iterator
DEFINE_GET(SJ_OD_array_iterator, SJ_OD_value, get)
Expand All @@ -126,8 +131,8 @@ DEFINE_GET(SJ_OD_object, STD_string_view, raw_json)
DEFINE_GET(SJ_OD_object, bool, is_empty)
DEFINE_GET(SJ_OD_object, bool, reset)
DEFINE_GET(SJ_OD_object, size_t, count_fields)
SJ_OD_value_result *SJ_OD_object_at_pointer(SJ_OD_object *self, const char *s,
size_t len);
DEFINE_AT_POINTER(SJ_OD_object)

SJ_OD_value_result *SJ_OD_object_find_field(SJ_OD_object *object,
const char *data, size_t len);
SJ_OD_value_result *SJ_OD_object_find_field_unordered(SJ_OD_object *object,
Expand Down
3 changes: 2 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ mod error;
pub mod ondemand;
pub mod padded_string;
pub mod prelude;
pub mod utils;
mod utils;

pub use error::{Result, SimdJsonError};
pub use simdjson_sys::{SIMDJSON_MAXSIZE_BYTES, SIMDJSON_PADDING};

// pub mod serde;

Expand Down
13 changes: 13 additions & 0 deletions src/ondemand/document.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,19 @@ impl<'p, 's> Document<'p, 's> {
)?;
Ok(string_view_to_str(sv))
}

pub fn at_pointer<'a>(&mut self, json_pointer: &str) -> Result<Value<'a>> {
map_result!(
ffi::SJ_OD_document_at_pointer(
self.ptr.as_mut(),
json_pointer.as_ptr().cast(),
json_pointer.len()
),
ffi::SJ_OD_value_result_error,
ffi::SJ_OD_value_result_value_unsafe
)
.map(Value::new)
}
}

impl_drop!(Document<'p, 's>, ffi::SJ_OD_document_free);
25 changes: 17 additions & 8 deletions src/ondemand/mod.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
pub mod array;
pub mod array_iterator;
pub mod document;
pub mod field;
pub mod object;
pub mod object_iterator;
pub mod parser;
pub mod value;
pub(crate) mod array;
pub(crate) mod array_iterator;
pub(crate) mod document;
pub(crate) mod field;
pub(crate) mod object;
pub(crate) mod object_iterator;
pub(crate) mod parser;
pub(crate) mod value;

pub use array::Array;
pub use array_iterator::ArrayIterator;
pub use document::Document;
pub use field::Field;
pub use object::Object;
pub use object_iterator::ObjectIterator;
pub use parser::Parser;
pub use value::Value;
13 changes: 13 additions & 0 deletions src/ondemand/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,19 @@ impl<'a> Value<'a> {
)?;
Ok(string_view_to_str(sv))
}

pub fn at_pointer(&mut self, json_pointer: &str) -> Result<Value<'a>> {
map_result!(
ffi::SJ_OD_value_at_pointer(
self.ptr.as_mut(),
json_pointer.as_ptr().cast(),
json_pointer.len()
),
ffi::SJ_OD_value_result_error,
ffi::SJ_OD_value_result_value_unsafe
)
.map(Value::new)
}
}

impl_drop!(Value<'a>, ffi::SJ_OD_value_free);

0 comments on commit 440347a

Please sign in to comment.