mirror of
https://github.com/fluencelabs/jsonpath
synced 2025-06-14 16:41:26 +00:00
Webassembly 기본
This commit is contained in:
2
.idea/runConfigurations/filter_all.xml
generated
2
.idea/runConfigurations/filter_all.xml
generated
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="filter_all" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="filter_all" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::json_filter::tests" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::json_filter::tests" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="filter_array - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="filter_array - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::json_filter::tests::array -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::json_filter::tests::array -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="filter_example- trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="filter_example- trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::json_filter::tests::example -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::json_filter::tests::example -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
2
.idea/runConfigurations/filter_op___trace.xml
generated
2
.idea/runConfigurations/filter_op___trace.xml
generated
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="filter_op - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="filter_op - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::json_filter::tests::op -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::json_filter::tests::op -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="filter_return_type - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="filter_return_type - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::json_filter::tests::return_type -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::json_filter::tests::return_type -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="filter_step_in- trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="filter_step_in- trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::json_filter::tests::step_in -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::json_filter::tests::step_in -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
2
.idea/runConfigurations/parse_array.xml
generated
2
.idea/runConfigurations/parse_array.xml
generated
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="parse_array" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="parse_array" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::parser::tests::parse_array -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::parser::tests::parse_array -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
2
.idea/runConfigurations/parse_array___trace.xml
generated
2
.idea/runConfigurations/parse_array___trace.xml
generated
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="parse_array - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="parse_array - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::parser::tests::parse_array -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::parser::tests::parse_array -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
2
.idea/runConfigurations/parse_array_float.xml
generated
2
.idea/runConfigurations/parse_array_float.xml
generated
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="parse_array_float" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="parse_array_float" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::parser::tests::parse_array_float -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::parser::tests::parse_array_float -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="parse_array_float - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="parse_array_float - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::parser::tests::parse_array_float -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::parser::tests::parse_array_float -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
2
.idea/runConfigurations/parse_path.xml
generated
2
.idea/runConfigurations/parse_path.xml
generated
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="parse_path" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="parse_path" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::parser::tests::parse_path -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::parser::tests::parse_path -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
2
.idea/runConfigurations/parse_path___trace.xml
generated
2
.idea/runConfigurations/parse_path___trace.xml
generated
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="parse_path - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="parse_path - trace" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::parser::tests::parse_path -- --exact" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::parser::tests::parse_path -- --exact" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
2
.idea/runConfigurations/parser_all.xml
generated
2
.idea/runConfigurations/parser_all.xml
generated
@ -1,7 +1,7 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="parser_all" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
<configuration default="false" name="parser_all" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package rs-jsonpath --lib jsonpath::parser::tests" />
|
<option name="command" value="test --package jsonpath --lib jsonpath::parser::tests" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="true" />
|
<option name="nocapture" value="true" />
|
||||||
<option name="backtrace" value="NO" />
|
<option name="backtrace" value="NO" />
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "rs-jsonpath"
|
name = "jsonpath"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["freestrings <freestrings@gmail.com>"]
|
authors = ["freestrings <freestrings@gmail.com>"]
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@ mod term;
|
|||||||
pub mod value_filter;
|
pub mod value_filter;
|
||||||
mod value_wrapper;
|
mod value_wrapper;
|
||||||
|
|
||||||
|
use super::parser::*;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
extern crate env_logger;
|
extern crate env_logger;
|
||||||
@ -10,7 +12,7 @@ mod tests {
|
|||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
use std::sync::{Once, ONCE_INIT};
|
use std::sync::{Once, ONCE_INIT};
|
||||||
|
|
||||||
use jsonpath::parser::Parser;
|
use super::parser::Parser;
|
||||||
|
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
|
@ -5,7 +5,7 @@ use std::result;
|
|||||||
|
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
|
||||||
use jsonpath::parser::*;
|
use super::parser::*;
|
||||||
|
|
||||||
use super::term::*;
|
use super::term::*;
|
||||||
use super::value_wrapper::*;
|
use super::value_wrapper::*;
|
||||||
@ -257,21 +257,16 @@ impl JsonValueFilter {
|
|||||||
pub fn new(json: &str) -> result::Result<Self, String> {
|
pub fn new(json: &str) -> result::Result<Self, String> {
|
||||||
let json: Value = serde_json::from_str(json)
|
let json: Value = serde_json::from_str(json)
|
||||||
.map_err(|e| e.description().to_string())?;
|
.map_err(|e| e.description().to_string())?;
|
||||||
Ok(JsonValueFilter {
|
Ok(JsonValueFilter::new_from_value(json))
|
||||||
json: Rc::new(Box::new(json)),
|
|
||||||
filter_stack: Vec::new(),
|
|
||||||
token_stack: Vec::new(),
|
|
||||||
term_stack: Vec::new(),
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_from_value(json: Value) -> result::Result<Self, String> {
|
pub fn new_from_value(json: Value) -> Self{
|
||||||
Ok(JsonValueFilter {
|
JsonValueFilter {
|
||||||
json: Rc::new(Box::new(json)),
|
json: Rc::new(Box::new(json)),
|
||||||
filter_stack: Vec::new(),
|
filter_stack: Vec::new(),
|
||||||
token_stack: Vec::new(),
|
token_stack: Vec::new(),
|
||||||
term_stack: Vec::new(),
|
term_stack: Vec::new(),
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_peek_token_array(&self) -> bool {
|
fn is_peek_token_array(&self) -> bool {
|
@ -1,4 +0,0 @@
|
|||||||
mod path_reader;
|
|
||||||
mod tokenizer;
|
|
||||||
pub mod parser;
|
|
||||||
pub mod json_filter;
|
|
24
src/lib.rs
24
src/lib.rs
@ -7,10 +7,11 @@ extern crate serde_json;
|
|||||||
extern crate core;
|
extern crate core;
|
||||||
extern crate indexmap;
|
extern crate indexmap;
|
||||||
|
|
||||||
mod jsonpath;
|
pub mod parser;
|
||||||
|
pub mod filter;
|
||||||
|
|
||||||
use jsonpath::parser::*;
|
use parser::parser::*;
|
||||||
use jsonpath::json_filter::value_filter::*;
|
use filter::value_filter::*;
|
||||||
|
|
||||||
use std::result;
|
use std::result;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
@ -23,7 +24,7 @@ pub fn compile<'a>(path: &'a str) -> impl FnMut(Value) -> Result + 'a {
|
|||||||
move |json| {
|
move |json| {
|
||||||
match &node {
|
match &node {
|
||||||
Ok(n) => {
|
Ok(n) => {
|
||||||
let mut jf = JsonValueFilter::new_from_value(json)?;
|
let mut jf = JsonValueFilter::new_from_value(json);
|
||||||
jf.visit(n.clone());
|
jf.visit(n.clone());
|
||||||
Ok(jf.take_value())
|
Ok(jf.take_value())
|
||||||
},
|
},
|
||||||
@ -32,9 +33,18 @@ pub fn compile<'a>(path: &'a str) -> impl FnMut(Value) -> Result + 'a {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn filter(json: Value, path: &str) -> Result {
|
pub fn reader(json: Value) -> impl FnMut(&str) -> Result {
|
||||||
let mut jf = JsonValueFilter::new_from_value(json)?;
|
let mut jf = JsonValueFilter::new_from_value(json);
|
||||||
|
move |path: &str| {
|
||||||
|
let mut parser = Parser::new(path);
|
||||||
|
parser.parse(&mut jf)?;
|
||||||
|
Ok(jf.take_value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn read(json: Value, path: &str) -> Result {
|
||||||
|
let mut jf = JsonValueFilter::new_from_value(json);
|
||||||
let mut parser = Parser::new(path);
|
let mut parser = Parser::new(path);
|
||||||
parser.parse(&mut jf)?;
|
parser.parse(&mut jf)?;
|
||||||
Ok(jf.take_value())
|
Ok(jf.take_value())
|
||||||
}
|
}
|
||||||
|
3
src/parser/mod.rs
Normal file
3
src/parser/mod.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
mod path_reader;
|
||||||
|
mod tokenizer;
|
||||||
|
pub mod parser;
|
@ -1,7 +1,7 @@
|
|||||||
use std::result;
|
use std::result;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
|
||||||
use jsonpath::path_reader::{
|
use super::path_reader::{
|
||||||
ReaderError,
|
ReaderError,
|
||||||
PathReader,
|
PathReader,
|
||||||
};
|
};
|
||||||
@ -361,7 +361,7 @@ impl<'a> PreloadedTokenizer<'a> {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::TokenError;
|
use super::TokenError;
|
||||||
use jsonpath::tokenizer::{
|
use super::{
|
||||||
Token,
|
Token,
|
||||||
Tokenizer,
|
Tokenizer,
|
||||||
PreloadedTokenizer,
|
PreloadedTokenizer,
|
11
wasm/.appveyor.yml
Normal file
11
wasm/.appveyor.yml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
install:
|
||||||
|
- appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe
|
||||||
|
- if not defined RUSTFLAGS rustup-init.exe -y --default-host x86_64-pc-windows-msvc --default-toolchain nightly
|
||||||
|
- set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
|
||||||
|
- rustc -V
|
||||||
|
- cargo -V
|
||||||
|
|
||||||
|
build: false
|
||||||
|
|
||||||
|
test_script:
|
||||||
|
- cargo test --locked
|
6
wasm/.gitignore
vendored
Normal file
6
wasm/.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
/target
|
||||||
|
**/*.rs.bk
|
||||||
|
Cargo.lock
|
||||||
|
bin/
|
||||||
|
pkg/
|
||||||
|
wasm-pack.log
|
69
wasm/.travis.yml
Normal file
69
wasm/.travis.yml
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
language: rust
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
cache: cargo
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
|
||||||
|
# Builds with wasm-pack.
|
||||||
|
- rust: beta
|
||||||
|
env: RUST_BACKTRACE=1
|
||||||
|
addons:
|
||||||
|
firefox: latest
|
||||||
|
chrome: stable
|
||||||
|
before_script:
|
||||||
|
- (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update)
|
||||||
|
- (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate)
|
||||||
|
- cargo install-update -a
|
||||||
|
- curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f
|
||||||
|
script:
|
||||||
|
- cargo generate --git . --name testing
|
||||||
|
# Having a broken Cargo.toml (in that it has curlies in fields) anywhere
|
||||||
|
# in any of our parent dirs is problematic.
|
||||||
|
- mv Cargo.toml Cargo.toml.tmpl
|
||||||
|
- cd testing
|
||||||
|
- wasm-pack build
|
||||||
|
- wasm-pack test --chrome --firefox --headless
|
||||||
|
|
||||||
|
# Builds on nightly.
|
||||||
|
- rust: nightly
|
||||||
|
env: RUST_BACKTRACE=1
|
||||||
|
before_script:
|
||||||
|
- (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update)
|
||||||
|
- (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate)
|
||||||
|
- cargo install-update -a
|
||||||
|
- rustup target add wasm32-unknown-unknown
|
||||||
|
script:
|
||||||
|
- cargo generate --git . --name testing
|
||||||
|
- mv Cargo.toml Cargo.toml.tmpl
|
||||||
|
- cd testing
|
||||||
|
- cargo check
|
||||||
|
- cargo check --target wasm32-unknown-unknown
|
||||||
|
- cargo check --no-default-features
|
||||||
|
- cargo check --target wasm32-unknown-unknown --no-default-features
|
||||||
|
- cargo check --no-default-features --features console_error_panic_hook
|
||||||
|
- cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook
|
||||||
|
- cargo check --no-default-features --features "console_error_panic_hook wee_alloc"
|
||||||
|
- cargo check --target wasm32-unknown-unknown --no-default-features --features "console_error_panic_hook wee_alloc"
|
||||||
|
|
||||||
|
# Builds on beta.
|
||||||
|
- rust: beta
|
||||||
|
env: RUST_BACKTRACE=1
|
||||||
|
before_script:
|
||||||
|
- (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update)
|
||||||
|
- (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate)
|
||||||
|
- cargo install-update -a
|
||||||
|
- rustup target add wasm32-unknown-unknown
|
||||||
|
script:
|
||||||
|
- cargo generate --git . --name testing
|
||||||
|
- mv Cargo.toml Cargo.toml.tmpl
|
||||||
|
- cd testing
|
||||||
|
- cargo check
|
||||||
|
- cargo check --target wasm32-unknown-unknown
|
||||||
|
- cargo check --no-default-features
|
||||||
|
- cargo check --target wasm32-unknown-unknown --no-default-features
|
||||||
|
- cargo check --no-default-features --features console_error_panic_hook
|
||||||
|
- cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook
|
||||||
|
# Note: no enabling the `wee_alloc` feature here because it requires
|
||||||
|
# nightly for now.
|
25
wasm/Cargo.toml
Normal file
25
wasm/Cargo.toml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
[package]
|
||||||
|
name = "wasm"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["freestrings <freestrings@gmail.com>"]
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["console_error_panic_hook"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
cfg-if = "0.1.2"
|
||||||
|
wasm-bindgen = { version = "0.2", features = ["serde-serialize"] }
|
||||||
|
console_error_panic_hook = { version = "0.1.1", optional = true }
|
||||||
|
wee_alloc = { version = "0.4.2", optional = true }
|
||||||
|
|
||||||
|
jsonpath = {path = "../"}
|
||||||
|
serde_json = { version = "1.0", features = ["preserve_order"] }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
wasm-bindgen-test = "0.2"
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
opt-level = "s"
|
11
wasm/build.sh
Executable file
11
wasm/build.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd ./www && \
|
||||||
|
rm -rf dist && \
|
||||||
|
rm -rf node_modules && \
|
||||||
|
npm install && \
|
||||||
|
cd .. && \
|
||||||
|
wasm-pack build --target=$1 --out-dir=www/node_modules/rs-jsonpath
|
||||||
|
|
94
wasm/src/lib.rs
Normal file
94
wasm/src/lib.rs
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
extern crate cfg_if;
|
||||||
|
extern crate wasm_bindgen;
|
||||||
|
|
||||||
|
extern crate serde_json;
|
||||||
|
extern crate jsonpath;
|
||||||
|
|
||||||
|
mod utils;
|
||||||
|
|
||||||
|
use cfg_if::cfg_if;
|
||||||
|
use wasm_bindgen::prelude::*;
|
||||||
|
use std::result::Result;
|
||||||
|
use serde_json::Value;
|
||||||
|
|
||||||
|
use jsonpath::parser::parser::*;
|
||||||
|
use jsonpath::filter::value_filter::*;
|
||||||
|
|
||||||
|
cfg_if! {
|
||||||
|
if #[cfg(feature = "wee_alloc")] {
|
||||||
|
extern crate wee_alloc;
|
||||||
|
#[global_allocator]
|
||||||
|
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn filter_value(json: Value, node: Node) -> JsValue {
|
||||||
|
let mut jf = JsonValueFilter::new_from_value(json);
|
||||||
|
jf.visit(node);
|
||||||
|
let taken = jf.take_value();
|
||||||
|
match JsValue::from_serde(&taken) {
|
||||||
|
Ok(js_value) => js_value,
|
||||||
|
Err(e) => JsValue::from_str(&format!("Json deserialize error: {:?}", e))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn into_value(js_value: &JsValue) -> Result<Value, String> {
|
||||||
|
if js_value.is_string() {
|
||||||
|
match serde_json::from_str(js_value.as_string().unwrap().as_str()) {
|
||||||
|
Ok(json) => Ok(json),
|
||||||
|
Err(e) => Err(format!("{:?}", e))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
match js_value.into_serde() {
|
||||||
|
Ok(json) => Ok(json),
|
||||||
|
Err(e) => Err(format!("{:?}", e))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn into_js_value(js_value: &JsValue, node: Node) -> JsValue {
|
||||||
|
match into_value(js_value) {
|
||||||
|
Ok(json) => filter_value(json, node),
|
||||||
|
Err(e) => JsValue::from_str(&format!("Json serialize error: {}", e))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
pub fn compile(path: &str) -> JsValue {
|
||||||
|
let mut parser = Parser::new(path);
|
||||||
|
let node = parser.compile();
|
||||||
|
let cb = Closure::wrap(Box::new(move |js_value: JsValue| {
|
||||||
|
match &node {
|
||||||
|
Ok(node) => into_js_value(&js_value, node.clone()),
|
||||||
|
Err(e) => JsValue::from_str(&format!("Json path error: {:?}", e))
|
||||||
|
}
|
||||||
|
}) as Box<Fn(JsValue) -> JsValue>);
|
||||||
|
|
||||||
|
let ret = cb.as_ref().clone();
|
||||||
|
cb.forget();
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
pub fn reader(js_value: JsValue) -> JsValue {
|
||||||
|
let cb = Closure::wrap(Box::new(move |path: String| {
|
||||||
|
let mut parser = Parser::new(path.as_str());
|
||||||
|
match parser.compile() {
|
||||||
|
Ok(node) => into_js_value(&js_value, node),
|
||||||
|
Err(e) => return JsValue::from_str(e.as_str())
|
||||||
|
}
|
||||||
|
}) as Box<Fn(String) -> JsValue>);
|
||||||
|
|
||||||
|
let ret = cb.as_ref().clone();
|
||||||
|
cb.forget();
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen]
|
||||||
|
pub fn read(js_value: JsValue, path: &str) -> JsValue {
|
||||||
|
let mut parser = Parser::new(path);
|
||||||
|
match parser.compile() {
|
||||||
|
Ok(node) => into_js_value(&js_value, node),
|
||||||
|
Err(e) => return JsValue::from_str(e.as_str())
|
||||||
|
}
|
||||||
|
}
|
11
wasm/src/utils.rs
Normal file
11
wasm/src/utils.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
use cfg_if::cfg_if;
|
||||||
|
|
||||||
|
cfg_if! {
|
||||||
|
if #[cfg(feature = "console_error_panic_hook")] {
|
||||||
|
extern crate console_error_panic_hook;
|
||||||
|
pub use self::console_error_panic_hook::set_once as set_panic_hook;
|
||||||
|
} else {
|
||||||
|
#[inline]
|
||||||
|
pub fn set_panic_hook() {}
|
||||||
|
}
|
||||||
|
}
|
13
wasm/tests/web.rs
Normal file
13
wasm/tests/web.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
//! Test suite for the Web and headless browsers.
|
||||||
|
|
||||||
|
#![cfg(target_arch = "wasm32")]
|
||||||
|
|
||||||
|
extern crate wasm_bindgen_test;
|
||||||
|
use wasm_bindgen_test::*;
|
||||||
|
|
||||||
|
wasm_bindgen_test_configure!(run_in_browser);
|
||||||
|
|
||||||
|
#[wasm_bindgen_test]
|
||||||
|
fn pass() {
|
||||||
|
assert_eq!(1 + 1, 2);
|
||||||
|
}
|
2
wasm/www/.gitignore
vendored
Normal file
2
wasm/www/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
node_modules
|
||||||
|
dist
|
5
wasm/www/.travis.yml
Normal file
5
wasm/www/.travis.yml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
language: node_js
|
||||||
|
node_js: "10"
|
||||||
|
|
||||||
|
script:
|
||||||
|
- ./node_modules/.bin/webpack
|
5
wasm/www/bootstrap.js
vendored
Normal file
5
wasm/www/bootstrap.js
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
// A dependency graph that contains any wasm must all be imported
|
||||||
|
// asynchronously. This `bootstrap.js` file does the single async import, so
|
||||||
|
// that no one else needs to worry about it again.
|
||||||
|
import("./index.js")
|
||||||
|
.catch(e => console.error("Error importing `index.js`:", e));
|
10
wasm/www/index.html
Normal file
10
wasm/www/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>JsonPath Evaluator</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script src="./bootstrap.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
16
wasm/www/index.js
Normal file
16
wasm/www/index.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import * as jsonpath from "rs-jsonpath";
|
||||||
|
|
||||||
|
let jsonString = "{\"a\" : 1}";
|
||||||
|
|
||||||
|
let template = jsonpath.compile("$.a");
|
||||||
|
console.log(template(jsonString));
|
||||||
|
console.log(template(JSON.parse(jsonString)));
|
||||||
|
|
||||||
|
let reader1 = jsonpath.reader(jsonString);
|
||||||
|
console.log(reader1("$.a"));
|
||||||
|
|
||||||
|
let reader2 = jsonpath.reader(JSON.parse(jsonString));
|
||||||
|
console.log(reader2("$.a"));
|
||||||
|
|
||||||
|
console.log(jsonpath.read(JSON.parse(jsonString), "$.a"));
|
||||||
|
console.log(jsonpath.read(jsonString, "$.a"));
|
5582
wasm/www/package-lock.json
generated
Normal file
5582
wasm/www/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
31
wasm/www/package.json
Normal file
31
wasm/www/package.json
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"name": "rs-jsonpath",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "webpack --config webpack.config.js",
|
||||||
|
"start": "webpack-dev-server"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/freestrings/jsonpath.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"webassembly",
|
||||||
|
"wasm",
|
||||||
|
"rust",
|
||||||
|
"webpack"
|
||||||
|
],
|
||||||
|
"author": "Changseok Han <freestrings@gmail.com>",
|
||||||
|
"license": "(MIT OR Apache-2.0)",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/freestrings/jsonpath/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/freestrings/jsonpath#readme",
|
||||||
|
"devDependencies": {
|
||||||
|
"copy-webpack-plugin": "^5.0.0",
|
||||||
|
"webpack": "^4.29.6",
|
||||||
|
"webpack-cli": "^3.1.0",
|
||||||
|
"webpack-dev-server": "^3.1.5"
|
||||||
|
}
|
||||||
|
}
|
14
wasm/www/webpack.config.js
Normal file
14
wasm/www/webpack.config.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
const CopyWebpackPlugin = require("copy-webpack-plugin");
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
entry: "./bootstrap.js",
|
||||||
|
output: {
|
||||||
|
path: path.resolve(__dirname, "dist"),
|
||||||
|
filename: "bootstrap.js",
|
||||||
|
},
|
||||||
|
mode: "development",
|
||||||
|
plugins: [
|
||||||
|
new CopyWebpackPlugin(['index.html'])
|
||||||
|
]
|
||||||
|
};
|
Reference in New Issue
Block a user