// SPDX-FileCopyrightText: 2026 Kerstin Humm // // SPDX-License-Identifier: AGPL-3.0-or-later import { AnnotatedWrapper, Rule } from "../types.js"; import { buildReference } from "../utils.js"; export default { name: "", validate: (self) => { let result = new AnnotatedWrapper(); if ("displayEndTime" in self) { result.assertBoolean(self, ["displayEndTime"], { kind: "Violation", id: "DisplayEndTimeNotABoolean", text: "displayEndTime is not a boolean", reference: buildReference({ url: "https://codeberg.org/fediverse/fep/src/branch/main/fep/8a8e/displayEndTime", }), }); } else { if ("endTime" in self) { result.annotateAt(["endTime"], { kind: "Note", id: "EndTimeButNoDisplayEndTime", text: "The endTime attribute is set. Specify displayEndTime to be deliberate about its meaning.", reference: buildReference({ anchor: "events-with-open-end", text: "If the event is open-ended, or the endTime is not intended to be displayed to humans, the https://w3id.org/fep/8a8e/displayEndTime attribute SHOULD be used and set to false.", }), }); } else { result.annotateAt([], { kind: "Warning", id: "NoEndTimeAndNoDisplayEndTime", text: "The endTime attribute is not set and there is no displayEndTime", reference: buildReference({ anchor: "events-with-open-end", text: "If the event is open-ended, or the endTime is not intended to be displayed to humans, the https://w3id.org/fep/8a8e/displayEndTime attribute SHOULD be used and set to false.", }), }); } } return result.value; }, tests: [ { value: {}, result: { annotations: ["NoEndTimeSet"], object: {} }, }, { value: { "displayEndTime": "not a boolean" }, result: { annotations: [], object: { "displayEndTime": "DisplayEndTimeNotABoolean" }, }, }, { value: { "endTime": "somevalue" }, result: { annotations: [], object: { "endTime": "EndTimeButNoDisplayEndTime" }, }, }, ], } satisfies Rule;