///|
test {
let base = @reference.UriReference::parse("HTTPS://Example.test/a/b").unwrap()
let relative = @reference.UriReference::parse("../c%2fd?#fragment").unwrap()
let resolved = relative.resolve(base).unwrap()
assert_eq(resolved.text(), "HTTPS://Example.test/c%2fd?#fragment")
assert_eq(resolved.identity(), "https://example.test/c%2Fd?#fragment")
assert_eq(relative.text(), "../c%2fd?#fragment")
assert_eq(resolved.query(), Some(""))
}///|
test {
let parts = ["a/b", "~key", "🛰"]
let pointer = @reference.JsonPointer::from_tokens(parts).unwrap()
parts.clear()
assert_eq(pointer.to_string(), "/a~1b/~0key/🛰")
let reference = @reference.Reference::parse("#/%7E01").unwrap()
assert_eq(reference.local_pointer().unwrap().tokens(), ["~1"])
let url = @reference.UriReference::parse("https://example.test/page#/raw~2").unwrap()
assert_eq(url.fragment(), Some("/raw~2"))
assert_true(@reference.Reference::from_uri(url) is Err(_))
}///|
test {
let doc = @json.parse("{\"defs\":{\"a/b\":[1,{\"ok\":true}]}}")
.unwrap()
.lower()
.unwrap()
let resource = @reference.Resource::new(
@reference.UriReference::parse("https://example.test/api/doc.json").unwrap(),
doc,
aliases=[
@reference.UriReference::parse("HTTPS://Example.test/api/./doc.json").unwrap(),
],
).unwrap()
let set = @reference.ResourceSet::new(
[resource],
root_base=Some(
@reference.UriReference::parse("https://example.test/api/").unwrap(),
),
).unwrap()
let found = set.resolve(
@reference.Reference::parse("doc.json#/defs/a~1b/1").unwrap(),
)
assert_true(found.complete())
let target = found.target().unwrap()
assert_eq(
target.resource().unwrap().text(),
"https://example.test/api/doc.json",
)
assert_eq(@json.write(target.target()).unwrap(), "{\"ok\":true}")
let absent = set.resolve(
@reference.Reference::parse("file:///etc/passwd").unwrap(),
)
assert_false(absent.complete())
assert_eq(absent.diagnostics()[0].code(), @json.UnavailableResource)
}///|
test {
let doc = @json.parse(
"{\"$id\":\"http://x.test/root.json\",\"definitions\":{\"B\":{\"$id\":\"b.json\",\"definitions\":{\"X\":{\"$id\":\"#x\"}}}}}",
)
.unwrap()
.lower()
.unwrap()
let index = @reference.SchemaIndex::new(
@reference.ResourceSet::empty(),
input=Some(doc),
input_roots=[@reference.JsonPointer::parse("").unwrap()],
)
let b = index.resolve(
@reference.Reference::parse("http://x.test/b.json").unwrap(),
)
let scope = index.scope(b.target().unwrap())
assert_eq(scope.unwrap().text(), "http://x.test/b.json")
for
text in ["#x", "#/definitions/X", "root.json#/definitions/B/definitions/X"] {
let found = index.resolve(
@reference.Reference::parse(text).unwrap(),
base=scope,
)
assert_eq(
found.target().unwrap().identity(),
"#/definitions/B/definitions/X",
)
}
}fn JsonPointer::from_tokens(parts : Array[String], limits? : Limits) -> Result[JsonPointer, Diagnostic]fn JsonPointer::resolve(self : JsonPointer, root : Value, limits? : Limits) -> Result[Value, Diagnostic]fn Reference::resolve(self : Reference, base : UriReference, limits? : Limits) -> Result[Reference, Diagnostic]pub enum ReferenceFragment {
WholeResource
PointerFragment(JsonPointer)
IdentifierFragment(String)
} derive(Debug)pub struct ReferenceStep {
site : Location?
reference : Reference
resolved : UriReference?
} derive(Debug)fn Resource::new(uri : UriReference, value : Value, aliases? : Array[UriReference], schema_roots? : Array[JsonPointer], limits? : Limits) -> Result[Resource, Diagnostic]fn ResourceSet::follow(self : ResourceSet, reference : Reference, next : (Location) -> Reference?, base? : UriReference?, limits? : Limits) -> Resolutionfn ResourceSet::new(resources : Array[Resource], root_base? : UriReference?, limits? : Limits) -> Result[ResourceSet, Diagnostic]fn ResourceSet::resolve(self : ResourceSet, reference : Reference, base? : UriReference?, limits? : Limits) -> Resolutionfn SchemaIndex::locate(self : SchemaIndex, resource : UriReference?, pointer : JsonPointer, limits? : Limits) -> Result[Location, Diagnostic]fn SchemaIndex::new(resources : ResourceSet, input? : Value?, input_base? : UriReference?, input_roots? : Array[JsonPointer], limits? : Limits) -> SchemaIndexfn SchemaIndex::resolve(self : SchemaIndex, reference : Reference, base? : UriReference?, limits? : Limits) -> Resolutionfn UriReference::resolve(self : UriReference, base : UriReference, limits? : Limits) -> Result[UriReference, Diagnostic]