Adds WebAssembly support to Oxigraph lib

pull/22/head
Tpt 5 years ago
parent 8c4c273edf
commit b530af153f
  1. 8
      .github/workflows/build.yml
  2. 6
      lib/Cargo.toml
  3. 25
      lib/src/model/xsd/date_time.rs
  4. 57
      lib/tests/wasm.rs

@ -32,3 +32,11 @@ jobs:
- run: cargo test --verbose --all
env:
RUST_BACKTRACE: 1
wasm:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- run: rustup update
- run: cargo install wasm-pack
- run: wasm-pack test --node lib

@ -29,8 +29,14 @@ rio_xml = "0.4"
hex = "0.4"
nom = "5"
[target.'cfg(target_arch = "wasm32")'.dependencies]
js-sys = "0.3"
[dev-dependencies]
rayon = "1"
[target.'cfg(target_arch = "wasm32")'.dev-dependencies]
wasm-bindgen-test = "0.3"
[build-dependencies]
peg = "0.5"

@ -579,12 +579,7 @@ impl Timestamp {
fn now() -> Result<Self, DateTimeError> {
Timestamp::new(
&date_time_plus_duration(
SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)?
.try_into()
.map_err(|_| DateTimeError {
kind: DateTimeErrorKind::Overflow,
})?,
since_unix_epoch()?,
&DateTimeSevenPropertyModel {
year: Some(1970),
month: Some(1),
@ -757,6 +752,24 @@ impl Timestamp {
}
}
#[cfg(target_arch = "wasm32")]
fn since_unix_epoch() -> Result<Duration, DateTimeError> {
Ok(Duration::new(
0,
Decimal::from_f64(js_sys::Date::now() / 1000.),
))
}
#[cfg(not(target_arch = "wasm32"))]
fn since_unix_epoch() -> Result<Duration, DateTimeError> {
SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)?
.try_into()
.map_err(|_| DateTimeError {
kind: DateTimeErrorKind::Overflow,
})
}
/// The [normalizeMonth](https://www.w3.org/TR/xmlschema11-2/#f-dt-normMo) function
fn normalize_month(yr: i64, mo: i64) -> Option<(i64, u8)> {
if mo >= 0 {

@ -0,0 +1,57 @@
#[cfg(target_arch = "wasm32")]
mod test {
use oxigraph::model::*;
use oxigraph::sparql::{PreparedQuery, QueryOptions, QueryResult};
use oxigraph::{MemoryRepository, Repository, RepositoryConnection, Result};
use std::str::FromStr;
use wasm_bindgen_test::*;
#[wasm_bindgen_test]
fn simple() {
let repository = MemoryRepository::default();
let mut connection = repository.connection().unwrap();
// insertion
let ex = NamedNode::parse("http://example.com").unwrap();
let quad = Quad::new(ex.clone(), ex.clone(), ex.clone(), None);
connection.insert(&quad).unwrap();
// quad filter
let results: Result<Vec<Quad>> = connection
.quads_for_pattern(None, None, None, None)
.collect();
assert_eq!(vec![quad], results.unwrap());
// SPARQL query
let prepared_query = connection
.prepare_query("SELECT ?s WHERE { ?s ?p ?o }", QueryOptions::default())
.unwrap();
let results = prepared_query.exec().unwrap();
if let QueryResult::Bindings(results) = results {
assert_eq!(
results.into_values_iter().next().unwrap().unwrap()[0],
Some(ex.into())
);
}
}
#[wasm_bindgen_test]
fn now() {
if let QueryResult::Bindings(results) = MemoryRepository::default()
.connection()
.unwrap()
.prepare_query(
"SELECT (YEAR(NOW()) AS ?y) WHERE {}",
QueryOptions::default(),
)
.unwrap()
.exec()
.unwrap()
{
if let Some(Term::Literal(l)) = &results.into_values_iter().next().unwrap().unwrap()[0]
{
let year = i64::from_str(l.value()).unwrap();
assert!(2020 <= year && year <= 2100);
}
}
}
}
Loading…
Cancel
Save