Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
63f849d
Fix DifferentIndividuals translation
ckindermann Sep 2, 2025
07c7449
DisjointUnionOf -> DisjointUnion
ckindermann Sep 2, 2025
3ae66a9
Expand IRIs in ofn_2_rdfa
ckindermann Sep 2, 2025
e19442f
Expand Iris in ofn_2_thick
ckindermann Sep 2, 2025
fe4b756
Expand IRis in labelling
ckindermann Sep 2, 2025
80cb20c
Expand IRIs in ofn_typing
ckindermann Sep 2, 2025
8e8e890
Expand IRIs in parser
ckindermann Sep 2, 2025
415e219
Expand IRis in thick_2_ofn
ckindermann Sep 2, 2025
d700247
Expand IRis in OWL datamodel
ckindermann Sep 2, 2025
2ffca29
Fix NegativePropertyAssertions
ckindermann Sep 15, 2025
4dc9298
Fix datatype translation
ckindermann Sep 30, 2025
06928b5
Handle full-iri datatypes
ckindermann Sep 30, 2025
e0ab504
Remove 'plain' literals
ckindermann Sep 30, 2025
b23175a
Fix data property assertion
ckindermann Sep 30, 2025
76d7190
Fix panic on empty array
ckindermann Oct 14, 2025
f03e524
Fix translation of HasKey axioms
ckindermann Oct 14, 2025
afa8fa3
Fix datatype
ckindermann Oct 21, 2025
f86b3c5
Update artifact build
ckindermann Dec 2, 2025
8c5d5c9
Add ClassAtom translation
ckindermann Feb 13, 2026
0f79761
Introduce constants for OWL vocabulary
ckindermann Feb 13, 2026
46e8720
Add function for splitting logic and annotations
ckindermann Feb 17, 2026
bcd596a
Refactor blank node generation
ckindermann Feb 17, 2026
909d2e6
Compile regexes once
ckindermann Feb 17, 2026
b5c3be4
Introduce constant for owl:Axiom
ckindermann Apr 8, 2026
3591e32
Replace xsd:string
ckindermann Apr 8, 2026
bca7191
Add constants for LDTab datatypes
ckindermann Apr 8, 2026
08a4f44
Move constants to top level
ckindermann Apr 8, 2026
4715c23
Use constants
ckindermann Apr 9, 2026
c3f6a69
Remove warnings
ckindermann Apr 9, 2026
2922db4
Expand IRIs in tests
ckindermann Apr 9, 2026
622f0d5
Expand IRIs in docstring tests
ckindermann Apr 9, 2026
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
71 changes: 19 additions & 52 deletions .github/workflows/Build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,42 +12,40 @@ jobs:
build-binaries:
strategy:
matrix:
target: [
{ runner: "macos-11", arch: "x86_64-apple-darwin" },
{ runner: "macos-11", arch: "aarch64-apple-darwin" },
{ runner: "windows-2022", arch: "x86_64-pc-windows-msvc" },
{ runner: "ubuntu-20.04", arch: "x86_64-unknown-linux-gnu" },
{ runner: "ubuntu-20.04", arch: "x86_64-unknown-linux-musl" },
]
target:
- { runner: "macos-latest", arch: "x86_64-apple-darwin" }
- { runner: "macos-latest", arch: "aarch64-apple-darwin" }
- { runner: "windows-2022", arch: "x86_64-pc-windows-msvc" }
- { runner: "ubuntu-latest", arch: "x86_64-unknown-linux-gnu" }
- { runner: "ubuntu-latest", arch: "x86_64-unknown-linux-musl" }

runs-on: ${{ matrix.target.runner }}

steps:
- name: Check out repository code
uses: actions/checkout@v3
uses: actions/checkout@v6

- name: Install musl-tools (MUSL)
if: ${{ matrix.target.runner == 'ubuntu-20.04' && matrix.target.arch == 'x86_64-unknown-linux-musl' }}
if: ${{ startsWith(matrix.target.runner, 'ubuntu') && matrix.target.arch == 'x86_64-unknown-linux-musl' }}
run: |
sudo apt-get update
sudo apt-get install musl-tools
sudo apt-get install -y musl-tools

- name: Install latest rust toolchain
uses: actions-rs/toolchain@v1
- name: Install latest Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
target: ${{ matrix.target.arch }}
default: true
override: true
targets: ${{ matrix.target.arch }}

- name: Build binary using cross (Linux)
if: ${{ matrix.target.runner == 'ubuntu-20.04' }}
if: ${{ startsWith(matrix.target.runner, 'ubuntu') }}
run: |
cargo install cross --git https://github.com/cross-rs/cross
sudo systemctl start docker
sudo systemctl start docker || true
cross build --release --target ${{ matrix.target.arch }}
cp target/${{ matrix.target.arch }}/release/wiring_rs wiring-${{ matrix.target.arch }}

- name: Build binary using cargo (MacOS)
if: ${{ matrix.target.runner == 'macos-11' }}
- name: Build binary using cargo (macOS)
if: ${{ startsWith(matrix.target.runner, 'macos') }}
run: |
cargo build --release --target ${{ matrix.target.arch }}
cp target/${{ matrix.target.arch }}/release/wiring_rs wiring-${{ matrix.target.arch }}
Expand All @@ -57,41 +55,10 @@ jobs:
run: |
cargo build --release --target ${{ matrix.target.arch }}
cp target\${{ matrix.target.arch }}\release\wiring_rs.exe wiring-${{ matrix.target.arch }}
#cp target\${{ matrix.target.arch }}\release\wiring.exe wiring-${{ matrix.target.arch }}.exe

- name: Upload binary artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.target.arch }}-bin
path: wiring-${{ matrix.target.arch }}
#path: man-parse-rust/target/${{ matrix.platform.target }}/release/man-parse-rust
if-no-files-found: error

# - name: Upload binary to release
# uses: svenstaro/upload-release-action@v2
# with:
# file: ontodev_valve-${{ matrix.target.arch }}*
# file_glob: true
# tag: ${{ github.ref }}
# overwrite: true
#
# cargo-publish:
# needs: build-binaries
# runs-on: ubuntu-20.04
# steps:
# - name: Check out repository code
# uses: actions/checkout@v3
#
# - name: Install latest rust toolchain
# uses: actions-rs/toolchain@v1
# with:
# toolchain: stable
# target: ${{ matrix.target.arch }}
# default: true
# override: true
#
# - name: Publish to crates.io
# env:
# CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
# run: |
# cargo publish
117 changes: 117 additions & 0 deletions src/constants.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
// -- RDF ----------------------------------------------------------------------
pub const RDF_FIRST: &str = "<http://www.w3.org/1999/02/22-rdf-syntax-ns#first>";
pub const RDF_LIST: &str = "<http://www.w3.org/1999/02/22-rdf-syntax-ns#List>";
pub const RDF_NIL: &str = "<http://www.w3.org/1999/02/22-rdf-syntax-ns#nil>";
pub const RDF_REST: &str = "<http://www.w3.org/1999/02/22-rdf-syntax-ns#rest>";
pub const RDF_TYPE: &str = "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>";

// -- LDTab datatype markers ---------------------------------------------------
pub const LDTAB_IRI: &str = "_IRI";
pub const LDTAB_JSON_LIST: &str = "_JSONLIST";
pub const LDTAB_JSON_MAP: &str = "_JSONMAP";

// -- RDFS ---------------------------------------------------------------------
pub const RDFS_DATATYPE: &str = "<http://www.w3.org/2000/01/rdf-schema#Datatype>";
pub const RDFS_DOMAIN: &str = "<http://www.w3.org/2000/01/rdf-schema#domain>";
pub const RDFS_LABEL: &str = "<http://www.w3.org/2000/01/rdf-schema#label>";
pub const RDFS_RANGE: &str = "<http://www.w3.org/2000/01/rdf-schema#range>";
pub const RDFS_SUB_CLASS_OF: &str = "<http://www.w3.org/2000/01/rdf-schema#subClassOf>";
pub const RDFS_SUB_PROPERTY_OF: &str = "<http://www.w3.org/2000/01/rdf-schema#subPropertyOf>";

// -- XSD ----------------------------------------------------------------------
pub const XSD_BOOLEAN: &str = "<http://www.w3.org/2001/XMLSchema#boolean>";
pub const XSD_BYTE: &str = "<http://www.w3.org/2001/XMLSchema#byte>";
pub const XSD_DECIMAL: &str = "<http://www.w3.org/2001/XMLSchema#decimal>";
pub const XSD_INT: &str = "<http://www.w3.org/2001/XMLSchema#int>";
pub const XSD_INTEGER: &str = "<http://www.w3.org/2001/XMLSchema#integer>";
pub const XSD_LONG: &str = "<http://www.w3.org/2001/XMLSchema#long>";
pub const XSD_NEGATIVE_INTEGER: &str = "<http://www.w3.org/2001/XMLSchema#negativeInteger>";
pub const XSD_NON_NEGATIVE_INTEGER: &str = "<http://www.w3.org/2001/XMLSchema#nonNegativeInteger>";
pub const XSD_NON_POSITIVE_INTEGER: &str = "<http://www.w3.org/2001/XMLSchema#nonPositiveInteger>";
pub const XSD_POSITIVE_INTEGER: &str = "<http://www.w3.org/2001/XMLSchema#positiveInteger>";
pub const XSD_SHORT: &str = "<http://www.w3.org/2001/XMLSchema#short>";
pub const XSD_STRING: &str = "<http://www.w3.org/2001/XMLSchema#string>";
pub const XSD_UNSIGNED_BYTE: &str = "<http://www.w3.org/2001/XMLSchema#unsignedByte>";
pub const XSD_UNSIGNED_INT: &str = "<http://www.w3.org/2001/XMLSchema#unsignedInt>";
pub const XSD_UNSIGNED_LONG: &str = "<http://www.w3.org/2001/XMLSchema#unsignedLong>";
pub const XSD_UNSIGNED_SHORT: &str = "<http://www.w3.org/2001/XMLSchema#unsignedShort>";

// -- OWL classes / types ------------------------------------------------------
pub const OWL_AXIOM: &str = "<http://www.w3.org/2002/07/owl#Axiom>";
pub const OWL_ALL_DIFFERENT: &str = "<http://www.w3.org/2002/07/owl#AllDifferent>";
pub const OWL_ALL_DISJOINT_CLASSES: &str = "<http://www.w3.org/2002/07/owl#AllDisjointClasses>";
pub const OWL_ALL_DISJOINT_PROPERTIES: &str = "<http://www.w3.org/2002/07/owl#AllDisjointProperties>";
pub const OWL_ALL_SAME_AS: &str = "<http://www.w3.org/2002/07/owl#AllSameAs>";
pub const OWL_ANNOTATION_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#AnnotationProperty>";
pub const OWL_ASYMMETRIC_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#AsymmetricProperty>";
pub const OWL_CLASS: &str = "<http://www.w3.org/2002/07/owl#Class>";
pub const OWL_DATATYPE_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#DatatypeProperty>";
pub const OWL_FUNCTIONAL_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#FunctionalProperty>";
pub const OWL_INVERSE_FUNCTIONAL_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#InverseFunctionalProperty>";
pub const OWL_IRREFLEXIVE_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#IrreflexiveProperty>";
pub const OWL_NAMED_INDIVIDUAL: &str = "<http://www.w3.org/2002/07/owl#NamedIndividual>";
pub const OWL_NEGATIVE_PROPERTY_ASSERTION: &str = "<http://www.w3.org/2002/07/owl#NegativePropertyAssertion>";
pub const OWL_OBJECT_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#ObjectProperty>";
pub const OWL_ONTOLOGY: &str = "<http://www.w3.org/2002/07/owl#Ontology>";
pub const OWL_REAL: &str = "<http://www.w3.org/2002/07/owl#real>";
pub const OWL_RATIONAL: &str = "<http://www.w3.org/2002/07/owl#rational>";
pub const OWL_REFLECTIVE_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#ReflexiveProperty>";
pub const OWL_RESTRICTION: &str = "<http://www.w3.org/2002/07/owl#Restriction>";
pub const OWL_SYMMETRIC_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#SymmetricProperty>";
pub const OWL_TRANSITIVE_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#TransitiveProperty>";

// -- OWL properties -----------------------------------------------------------
pub const OWL_ALL_VALUES_FROM: &str = "<http://www.w3.org/2002/07/owl#allValuesFrom>";
pub const OWL_ASSERTION_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#assertionProperty>";
pub const OWL_CARDINALITY: &str = "<http://www.w3.org/2002/07/owl#cardinality>";
pub const OWL_COMPLEMENT_OF: &str = "<http://www.w3.org/2002/07/owl#complementOf>";
pub const OWL_DIFFERENT_FROM: &str = "<http://www.w3.org/2002/07/owl#differentFrom>";
pub const OWL_DISJOINT_UNION_OF: &str = "<http://www.w3.org/2002/07/owl#disjointUnionOf>";
pub const OWL_DISJOINT_WITH: &str = "<http://www.w3.org/2002/07/owl#disjointWith>";
pub const OWL_DISTINCT_MEMBERS: &str = "<http://www.w3.org/2002/07/owl#distinctMembers>";
pub const OWL_EQUIVALENT_CLASS: &str = "<http://www.w3.org/2002/07/owl#equivalentClass>";
pub const OWL_EQUIVALENT_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#equivalentProperty>";
pub const OWL_HAS_KEY: &str = "<http://www.w3.org/2002/07/owl#hasKey>";
pub const OWL_HAS_SELF: &str = "<http://www.w3.org/2002/07/owl#hasSelf>";
pub const OWL_HAS_VALUE: &str = "<http://www.w3.org/2002/07/owl#hasValue>";
pub const OWL_IMPORTS: &str = "<http://www.w3.org/2002/07/owl#imports>";
pub const OWL_INTERSECTION_OF: &str = "<http://www.w3.org/2002/07/owl#intersectionOf>";
pub const OWL_INVERSE_OF: &str = "<http://www.w3.org/2002/07/owl#inverseOf>";
pub const OWL_MAX_CARDINALITY: &str = "<http://www.w3.org/2002/07/owl#maxCardinality>";
pub const OWL_MAX_QUALIFIED_CARDINALITY: &str = "<http://www.w3.org/2002/07/owl#maxQualifiedCardinality>";
pub const OWL_MEMBERS: &str = "<http://www.w3.org/2002/07/owl#members>";
pub const OWL_MIN_CARDINALITY: &str = "<http://www.w3.org/2002/07/owl#minCardinality>";
pub const OWL_MIN_QUALIFIED_CARDINALITY: &str = "<http://www.w3.org/2002/07/owl#minQualifiedCardinality>";
pub const OWL_ON_CLASS: &str = "<http://www.w3.org/2002/07/owl#onClass>";
pub const OWL_ON_DATA_RANGE: &str = "<http://www.w3.org/2002/07/owl#onDataRange>";
pub const OWL_ON_PROPERTY: &str = "<http://www.w3.org/2002/07/owl#onProperty>";
pub const OWL_ONE_OF: &str = "<http://www.w3.org/2002/07/owl#oneOf>";
pub const OWL_PROPERTY_CHAIN_AXIOM: &str = "<http://www.w3.org/2002/07/owl#propertyChainAxiom>";
pub const OWL_PROPERTY_DISJOINT_WITH: &str = "<http://www.w3.org/2002/07/owl#propertyDisjointWith>";
pub const OWL_QUALIFIED_CARDINALITY: &str = "<http://www.w3.org/2002/07/owl#qualifiedCardinality>";
pub const OWL_SAME_AS: &str = "<http://www.w3.org/2002/07/owl#sameAs>";
pub const OWL_SOME_VALUES_FROM: &str = "<http://www.w3.org/2002/07/owl#someValuesFrom>";
pub const OWL_SOURCE_INDIVIDUAL: &str = "<http://www.w3.org/2002/07/owl#sourceIndividual>";
pub const OWL_TARGET_INDIVIDUAL: &str = "<http://www.w3.org/2002/07/owl#targetIndividual>";
pub const OWL_TARGET_VALUE: &str = "<http://www.w3.org/2002/07/owl#targetValue>";
pub const OWL_UNION_OF: &str = "<http://www.w3.org/2002/07/owl#unionOf>";
pub const OWL_VERSION_IRI: &str = "<http://www.w3.org/2002/07/owl#versionIRI>";

// -- SWRL ---------------------------------------------------------------------
pub const SWRL_ARGUMENT1: &str = "<http://www.w3.org/2003/11/swrl#argument1>";
pub const SWRL_ARGUMENT2: &str = "<http://www.w3.org/2003/11/swrl#argument2>";
pub const SWRL_ARGUMENTS: &str = "<http://www.w3.org/2003/11/swrl#arguments>";
pub const SWRL_BODY: &str = "<http://www.w3.org/2003/11/swrl#body>";
pub const SWRL_BUILTIN: &str = "<http://www.w3.org/2003/11/swrl#builtin>";
pub const SWRL_BUILTIN_ATOM: &str = "<http://www.w3.org/2003/11/swrl#BuiltinAtom>";
pub const SWRL_CLASS_ATOM: &str = "<http://www.w3.org/2003/11/swrl#ClassAtom>";
pub const SWRL_CLASS_PREDICATE: &str = "<http://www.w3.org/2003/11/swrl#classPredicate>";
pub const SWRL_DATA_RANGE: &str = "<http://www.w3.org/2003/11/swrl#dataRange>";
pub const SWRL_DATA_RANGE_ATOM: &str = "<http://www.w3.org/2003/11/swrl#DataRangeAtom>";
pub const SWRL_DATAVALUED_PROPERTY_ATOM: &str = "<http://www.w3.org/2003/11/swrl#DatavaluedPropertyAtom>";
pub const SWRL_DIFFERENT_INDIVIDUALS_ATOM: &str = "<http://www.w3.org/2003/11/swrl#DifferentIndividualsAtom>";
pub const SWRL_HEAD: &str = "<http://www.w3.org/2003/11/swrl#head>";
pub const SWRL_IMP: &str = "<http://www.w3.org/2003/11/swrl#Imp>";
pub const SWRL_INDIVIDUAL_PROPERTY_ATOM: &str = "<http://www.w3.org/2003/11/swrl#IndividualPropertyAtom>";
pub const SWRL_PROPERTY_PREDICATE: &str = "<http://www.w3.org/2003/11/swrl#propertyPredicate>";
pub const SWRL_SAME_INDIVIDUAL_ATOM: &str = "<http://www.w3.org/2003/11/swrl#SameIndividualAtom>";
37 changes: 19 additions & 18 deletions src/ldtab_2_ofn/axiom_translation.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::constants::*;
use crate::ldtab_2_ofn::class_translation;
use crate::owl::thick_triple as owl;
use serde_json::Value;
Expand Down Expand Up @@ -353,7 +354,7 @@ pub fn translate_disjoint_with(subject: &owl::OWL, object: &owl::OWL) -> Value {
///
/// let axiom : Value = translation::translate_disjoint_union(&union_owl,
/// &operands_owl);
/// let axiom_expected_string = r#"["DisjointUnionOf","obo:IAO_0000120","obo:IAO_0000121","obo:IAO_0000122"]"#;
/// let axiom_expected_string = r#"["DisjointUnion","obo:IAO_0000120","obo:IAO_0000121","obo:IAO_0000122"]"#;
/// let axiom_expected : Value = serde_json::from_str(axiom_expected_string).unwrap();
///
/// assert_eq!(axiom, axiom_expected);
Expand All @@ -362,7 +363,7 @@ pub fn translate_disjoint_union(union: &owl::OWL, operands: &owl::OWL) -> Value
let lhs = class_translation::translate(union);
let rhs = class_translation::translate(operands);

let operator = Value::String("DisjointUnionOf".into());
let operator = Value::String("DisjointUnion".into());

match rhs {
Value::Array(mut arr) => {
Expand Down Expand Up @@ -391,27 +392,27 @@ pub fn translate_disjoint_union(union: &owl::OWL, operands: &owl::OWL) -> Value
///```
pub fn get_ofn_operator(op: &str) -> Value {
match op {
"<http://www.w3.org/2000/01/rdf-schema#Datatype>" => Value::String(String::from("Datatype")),
"<http://www.w3.org/2002/07/owl#Class>" => Value::String(String::from("Class")),
"owl:ObjectProperty" => Value::String(String::from("ObjectProperty")),
"owl:DatatypeProperty" => Value::String(String::from("DataProperty")),
"owl:AnnotationProperty" => Value::String(String::from("AnnotationProperty")),
"owl:NamedIndividual" => Value::String(String::from("NamedIndividual")),
RDFS_DATATYPE => Value::String(String::from("Datatype")),
OWL_CLASS => Value::String(String::from("Class")),
OWL_OBJECT_PROPERTY => Value::String(String::from("ObjectProperty")),
OWL_DATATYPE_PROPERTY => Value::String(String::from("DataProperty")),
OWL_ANNOTATION_PROPERTY => Value::String(String::from("AnnotationProperty")),
OWL_NAMED_INDIVIDUAL => Value::String(String::from("NamedIndividual")),

"owl:FunctionalProperty" => Value::String(String::from("FunctionalProperty")),
OWL_FUNCTIONAL_PROPERTY => Value::String(String::from("FunctionalProperty")),

"owl:InverseFunctionalProperty" => {
OWL_INVERSE_FUNCTIONAL_PROPERTY => {
Value::String(String::from("InverseObjectFunctionalProperty"))
}
"owl:ReflexiveProperty" => Value::String(String::from("ReflexiveObjectProperty")),
"owl:IrreflexiveProperty" => Value::String(String::from("IrreflexiveObjectProperty")),
"owl:SymmetricProperty" => Value::String(String::from("SymmetricObjectProperty")),
"owl:AsymmetricProperty" => Value::String(String::from("AsymmetricObjectProperty")),
"owl:TransitiveProperty" => Value::String(String::from("TransitiveObjectProperty")),
OWL_REFLECTIVE_PROPERTY => Value::String(String::from("ReflexiveObjectProperty")),
OWL_IRREFLEXIVE_PROPERTY => Value::String(String::from("IrreflexiveObjectProperty")),
OWL_SYMMETRIC_PROPERTY => Value::String(String::from("SymmetricObjectProperty")),
OWL_ASYMMETRIC_PROPERTY => Value::String(String::from("AsymmetricObjectProperty")),
OWL_TRANSITIVE_PROPERTY => Value::String(String::from("TransitiveObjectProperty")),

"<http://www.w3.org/2002/07/owl#AllDifferent>" => Value::String(String::from("DifferentIndividuals")),
OWL_ALL_DIFFERENT => Value::String(String::from("DifferentIndividuals")),

"owl:Ontology" => Value::String(String::from("ThinTriple")),
OWL_ONTOLOGY => Value::String(String::from("ThinTriple")),

_ => Value::String(String::from("ClassAssertion")),
}
Expand All @@ -428,7 +429,7 @@ pub fn get_ofn_operator(op: &str) -> Value {
/// use wiring_rs::owl::thick_triple as owl;
///
/// let lhs = "\"obo:IAO_0000120\"";
/// let rhs = "\"owl:FunctionalProperty\"";
/// let rhs = "\"<http://www.w3.org/2002/07/owl#FunctionalProperty>\"";
///
/// let lhs_owl : owl::OWL = serde_json::from_str(lhs).unwrap();
/// let rhs_owl : owl::OWL = serde_json::from_str(rhs).unwrap();
Expand Down
Loading
Loading