]> Lady’s Gitweb - Etiquette/commitdiff
Add `::iriSpace` and use it in I·R·I handling
authorLady <redacted>
Mon, 29 May 2023 20:11:45 +0000 (13:11 -0700)
committerLady <redacted>
Wed, 14 Jun 2023 02:08:02 +0000 (19:08 -0700)
This can be recorded as a VoID property and is necessary for converting
I·R·I’s back into their identifiers.

model.js
model.test.js

index 6963a16778601567b5d56bef31763af503eeeba1..48e68134bb1bdcf9ff9531169c6c70a901c0065d 100644 (file)
--- a/model.js
+++ b/model.js
@@ -239,15 +239,19 @@ class Tag {
    * generating the value of `TagSystem::Tag`. It isn’t possible to
    * access this function in its unbound form from outside this module.
    *
+   * ☡ This function throws if the I·R·I is not in the `.iriSpace` of
+   * the `TagSystem` associated with this constructor.
+   *
    * ※ If the I·R·I is not recognized, this function returns `null`.
    */
   static fromIRI(system, storage, iri) {
     const name = `${iri}`;
-    const prefix =
-      `https://${system.authorityName}/tag:${system.taggingEntity}:`;
+    const prefix = `${system.iriSpace}`;
     if (!name.startsWith(prefix)) {
       // The I·R·I does not begin with the expected prefix.
-      return null;
+      throw new RangeError(
+        `I·R·I did not begin with the expected prefix: ${iri}`,
+      );
     } else {
       // The I·R·I begins with the expected prefix.
       const identifier = name.substring(prefix.length);
@@ -298,7 +302,7 @@ class Tag {
     if (!tagName.startsWith(tagPrefix)) {
       // The Tag U·R·I does not begin with the expected prefix.
       throw new RangeError(
-        `Tag U·R·I did not begin with the expected prefix: ${tagName}`,
+        `Tag U·R·I did not begin with the expected prefix: ${tagURI}`,
       );
     } else {
       // The I·R·I begins with the expected prefix.
@@ -973,10 +977,13 @@ class Tag {
 
   /** Returns the I·R·I for this `Tag`. */
   get iri() {
-    const tagURI = this.tagURI;
-    return tagURI == null
-      ? null
-      : `https://${this.authorityName}/${tagURI}`;
+    const { identifier, iriSpace } = this;
+    return identifier == null ? null : `${iriSpace}${identifier}`;
+  }
+
+  /** Returns the I·R·I space for this `Tag`. */
+  get iriSpace() {
+    return this.#system.iriSpace;
   }
 
   /** Returns the kind of this `Tag`. */
@@ -1700,7 +1707,14 @@ export class TagSystem {
 
   /** Returns the I·R·I for this `TagSystem`. */
   get iri() {
-    return `https://${this.authorityName}/${this.tagURI}`;
+    return `${this.iriSpace}${this.identifier}`;
+  }
+
+  /**
+   * Returns the prefix used for I·R·I’s of `Tag`s in this `TagSystem`.
+   */
+  get iriSpace() {
+    return `https://${this.authorityName}/tag:${this.taggingEntity}:`;
   }
 
   /** Returns the Tag U·R·I for this `TagSystem`. */
index 7190830c3a043dd200bfecf4ed7d68d924e6b32c..15a2f54cfa955831457a64d8dcd215e486937ed4 100644 (file)
@@ -186,8 +186,8 @@ describe("TagSystem", () => {
         );
       });
 
-      it("[[Call]] returns null if passed an invalid I·R·I", () => {
-        assertStrictEquals(Tag.fromIRI(`bad iri`), null);
+      it("[[Call]] throws if passed an invalid I·R·I", () => {
+        assertThrows(() => {Tag.fromIRI(`bad iri`)});
       });
     });
 
@@ -233,11 +233,11 @@ describe("TagSystem", () => {
 
       it("[[Call]] returns null if no tag with the given Tag U·R·I has been persisted", () => {
         assertStrictEquals(
-          Tag.fromIRI(`tag:${system.taggingEntity}:`),
+          Tag.fromTagURI(`tag:${system.taggingEntity}:`),
           null,
         );
         assertStrictEquals(
-          Tag.fromIRI(`tag:${system.taggingEntity}:000-0000`),
+          Tag.fromTagURI(`tag:${system.taggingEntity}:000-0000`),
           null,
         );
       });
@@ -763,6 +763,8 @@ describe("TagSystem", () => {
 
     // `::iri` is tested by a `.fromIRI`.
 
+    // `::iriSpace` is tested by a `.fromIRI`.
+
     // `::kind` is tested by the constructor.
 
     describe("::narrowerTags", () => {
@@ -1028,6 +1030,25 @@ describe("TagSystem", () => {
     });
   });
 
+  describe("::iriSpace", () => {
+    it("[[Get]] returns the I·R·I space", () => {
+      const system = new TagSystem("etaoin.example", "1972-12-31");
+      assertStrictEquals(
+        system.iriSpace,
+        "https://etaoin.example/tag:etaoin.example,1972-12-31:",
+      );
+      const system2 = new TagSystem(
+        "etaoin.example",
+        "1972-12-31",
+        "etaoin",
+      );
+      assertStrictEquals(
+        system2.iriSpace,
+        "https://etaoin.example/tag:etaoin.example,1972-12-31:",
+      );
+    });
+  });
+
   describe("::tagURI", () => {
     it("[[Get]] returns the Tag U·R·I", () => {
       const system = new TagSystem("etaoin.example", "1972-12-31");
This page took 0.079679 seconds and 4 git commands to generate.