Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ resolver = "2"
members = ["simdjson-sys"]

[workspace.package]
version = "0.3.0-alpha.3"
version = "0.4.0-alpha"

[workspace.dependencies]
simdjson-sys = { path = "simdjson-sys", version = "0.1.0-alpha.2" }
simdjson-sys = { path = "simdjson-sys", version = "0.2.0-alpha" }


[dependencies]
thiserror = "1.0"
thiserror = "2.0"
simdjson-sys = { workspace = true }

# serde compatibilty
Expand Down
55 changes: 54 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
[![Crates.io](https://img.shields.io/crates/v/simdjson-rust?style=for-the-badge)](https://crates.io/crates/simdjson-rust)
[![docs.rs](https://img.shields.io/docsrs/simdjson-rust/latest?style=for-the-badge)](https://docs.rs/simdjson-rust)

This crate currently uses [`simdjson 3.2.3`][simdjson]. You can have a try and give feedback.
This crate currently uses [`simdjson 4.2.4`][simdjson]. You can have a try and give feedback.

If you

Expand Down Expand Up @@ -110,6 +110,59 @@ fn main() -> simdjson_rust::Result<()> {
}
```

### Serde Integration

This crate provides optional serde compatibility with SIMD-accelerated JSON serialization and deserialization.

Enable serde support by adding the feature:

```toml
simdjson-rust = { version = "0.4.0-alpha", features = ["serde_impl"] }
```

#### Deserialization (Parsing JSON to Rust structs)

```rust
use serde::Deserialize;
use simdjson_rust::dom::Parser;
use simdjson_rust::serde::de::from_element;

#[derive(Deserialize)]
struct User {
name: String,
age: u32,
active: bool,
}

let mut parser = Parser::default();
let ps = r#"{"name": "Alice", "age": 30, "active": true}"#.to_padded_string();
let elm = parser.parse(&ps)?;
let user: User = from_element(&elm)?;
```

#### Serialization (Rust structs to JSON)

```rust
use serde::Serialize;
use simdjson_rust::serde::ser::to_string;

#[derive(Serialize)]
struct User {
name: String,
age: u32,
active: bool,
}

let user = User {
name: "Alice".to_string(),
age: 30,
active: true,
};

let json = to_string(&user)?;
// Output: {"name":"Alice","age":30,"active":true}
```

## Other interesting things

There are also pure Rust port of [`simdjson`][simdjson] available here [`simd-json`](https://github.com/simd-lite/simd-json).
Expand Down
2 changes: 1 addition & 1 deletion examples/issue_20.rs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion examples/quickstart.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use simdjson_rust::{ondemand, prelude::*, Result};
use simdjson_rust::{Result, ondemand, prelude::*};

fn main() -> Result<()> {
let ps = load_padded_string("simdjson-sys/simdjson/jsonexamples/twitter.json")?;
Expand Down
6 changes: 3 additions & 3 deletions simdjson-sys/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "simdjson-sys"
version = "0.1.0-alpha.2"
version = "0.2.0-alpha"
edition = "2021"
authors = ["SunDoge <384813529@qq.com>"]
license = "Apache-2.0"
Expand All @@ -16,5 +16,5 @@ exclude = ["simdjson/", "!simdjson/singleheader/simdjson.*"]
[dependencies]

[build-dependencies]
bindgen = "0.66.1"
cc = { version = "1.0.83", features = ["parallel"] }
bindgen = "0.72.1"
cc = { version = "1.2.56", features = ["parallel"] }
4 changes: 2 additions & 2 deletions simdjson-sys/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::{env, path::PathBuf};
fn main() {
cc::Build::new()
.cpp(true)
.flag_if_supported("-std=c++17")
.flag_if_supported("-std=c++20")
.flag_if_supported("/std:c++20") // error C7555: use of designated initializers requires at least '/std:c++20'
.flag_if_supported("-pthread")
.flag_if_supported("-O3")
Expand All @@ -22,7 +22,7 @@ fn main() {
.header("src/simdjson_c_api.h")
// Tell cargo to invalidate the built crate whenever any of the
// included header files changed.
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
// Finish the builder and generate the bindings.
.generate()
// Unwrap the Result and panic on failure.
Expand Down
2 changes: 1 addition & 1 deletion simdjson-sys/simdjson
Submodule simdjson updated 387 files
88 changes: 87 additions & 1 deletion simdjson-sys/src/simdjson_c_api.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#include "simdjson_c_api.h"
#include "simdjson.h"
#include "simdjson_c_api.h"
#include <cstdint>
#include <string_view>
#include <utility>
Expand Down Expand Up @@ -517,3 +517,89 @@ bool SJ_DOM_document_stream_iterator_not_equal(
SJ_DOM_document_stream_iterator *rhs) {
return *cast_to_type(lhs) != *cast_to_type(rhs);
}

// builder::string_builder
IMPL_HANDLE(SJ_string_builder, simdjson::builder::string_builder)

SJ_string_builder *SJ_string_builder_new(size_t initial_capacity) {
return object_to_pointer<SJ_string_builder *>(
simdjson::builder::string_builder(initial_capacity));
}

void SJ_string_builder_clear(SJ_string_builder *sb) {
cast_to_type(sb)->clear();
}

void SJ_string_builder_append_bool(SJ_string_builder *sb, bool v) {
cast_to_type(sb)->append(v);
}

void SJ_string_builder_append_int64(SJ_string_builder *sb, int64_t v) {
cast_to_type(sb)->append(v);
}

void SJ_string_builder_append_uint64(SJ_string_builder *sb, uint64_t v) {
cast_to_type(sb)->append(v);
}

void SJ_string_builder_append_double(SJ_string_builder *sb, double v) {
cast_to_type(sb)->append(v);
}

void SJ_string_builder_append_null(SJ_string_builder *sb) {
cast_to_type(sb)->append_null();
}

void SJ_string_builder_append_char(SJ_string_builder *sb, char c) {
cast_to_type(sb)->append(c);
}

void SJ_string_builder_escape_and_append_with_quotes(SJ_string_builder *sb,
const char *str,
size_t len) {
cast_to_type(sb)->escape_and_append_with_quotes(std::string_view(str, len));
}

void SJ_string_builder_start_object(SJ_string_builder *sb) {
cast_to_type(sb)->start_object();
}

void SJ_string_builder_end_object(SJ_string_builder *sb) {
cast_to_type(sb)->end_object();
}

void SJ_string_builder_start_array(SJ_string_builder *sb) {
cast_to_type(sb)->start_array();
}

void SJ_string_builder_end_array(SJ_string_builder *sb) {
cast_to_type(sb)->end_array();
}

void SJ_string_builder_append_comma(SJ_string_builder *sb) {
cast_to_type(sb)->append_comma();
}

void SJ_string_builder_append_colon(SJ_string_builder *sb) {
cast_to_type(sb)->append_colon();
}

void SJ_string_builder_append_raw(SJ_string_builder *sb, const char *str,
size_t len) {
cast_to_type(sb)->append_raw(str, len);
}

SJ_string_view_result SJ_string_builder_view(const SJ_string_builder *sb) {
std::string_view sv;
const error_code error =
cast_to_type(const_cast<SJ_string_builder *>(sb))->view().get(sv);
return {static_cast<int>(error), {.data = sv.data(), .len = sv.size()}};
}

bool SJ_string_builder_validate_unicode(const SJ_string_builder *sb) {
return cast_to_type(const_cast<SJ_string_builder *>(sb))->validate_unicode();
}

size_t SJ_string_builder_size(const SJ_string_builder *sb) {
return cast_to_type(const_cast<SJ_string_builder *>(sb))->size();
}
32 changes: 29 additions & 3 deletions simdjson-sys/src/simdjson_c_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,9 +233,9 @@ SJ_DOM_parser *SJ_DOM_parser_new(size_t max_capacity);
SJ_DOM_element_result SJ_DOM_parser_parse(SJ_DOM_parser *parser,
const char *json, size_t len);
SJ_DOM_element_result SJ_DOM_parser_parse_into_document(SJ_DOM_parser *parser,
SJ_DOM_document *doc,
const char *json,
size_t len);
SJ_DOM_document *doc,
const char *json,
size_t len);
SJ_DOM_document_stream_result SJ_DOM_parser_parse_many(SJ_DOM_parser *parser,
const char *json,
size_t len,
Expand Down Expand Up @@ -297,6 +297,32 @@ DEFINE_GET_V2(SJ_DOM_document_stream_iterator, void, step)
bool SJ_DOM_document_stream_iterator_not_equal(
SJ_DOM_document_stream_iterator *lhs, SJ_DOM_document_stream_iterator *rhs);

// builder::string_builder
DEFINE_HANDLE(SJ_string_builder)

SJ_string_builder *SJ_string_builder_new(size_t initial_capacity);
void SJ_string_builder_clear(SJ_string_builder *sb);
void SJ_string_builder_append_bool(SJ_string_builder *sb, bool v);
void SJ_string_builder_append_int64(SJ_string_builder *sb, int64_t v);
void SJ_string_builder_append_uint64(SJ_string_builder *sb, uint64_t v);
void SJ_string_builder_append_double(SJ_string_builder *sb, double v);
void SJ_string_builder_append_null(SJ_string_builder *sb);
void SJ_string_builder_append_char(SJ_string_builder *sb, char c);
void SJ_string_builder_escape_and_append_with_quotes(SJ_string_builder *sb,
const char *str,
size_t len);
void SJ_string_builder_start_object(SJ_string_builder *sb);
void SJ_string_builder_end_object(SJ_string_builder *sb);
void SJ_string_builder_start_array(SJ_string_builder *sb);
void SJ_string_builder_end_array(SJ_string_builder *sb);
void SJ_string_builder_append_comma(SJ_string_builder *sb);
void SJ_string_builder_append_colon(SJ_string_builder *sb);
void SJ_string_builder_append_raw(SJ_string_builder *sb, const char *str,
size_t len);
SJ_string_view_result SJ_string_builder_view(const SJ_string_builder *sb);
bool SJ_string_builder_validate_unicode(const SJ_string_builder *sb);
size_t SJ_string_builder_size(const SJ_string_builder *sb);

#ifdef __cplusplus
}
#endif
Loading
Loading