Current section

Files

Jump to
nldoc_validation lib nldoc validation rules definition_term_has_definition_details.ex
Raw

lib/nldoc/validation/rules/definition_term_has_definition_details.ex

defmodule NLdoc.Validation.Rules.DefinitionTermHasDefinitionDetails do
@moduledoc """
This rule validates that each DefinitionTerm in a DefinitionList is followed by a DefinitionDetails.
"""
alias NLdoc.Spec.{DefinitionDetails, DefinitionList, DefinitionTerm}
alias NLdoc.Validation.{Severity, State}
use NLdoc.Validation.Rule,
severity: Severity.error(),
rule: "definition-term-has-definition-details",
ruleset: "https://validation.spec.nldoc.nl/",
# @TODO set `ruleset_version` to a real version
ruleset_version: "unknown",
validates: [DefinitionDetails, DefinitionList, DefinitionTerm]
@impl true
# Set the current id of the DefinitionTerm.
def update_state(state = %State{}, %DefinitionTerm{id: id}),
do: state |> State.set(:definition_term_id_without_details, id)
# The previous one has details if it is followed by a DefinitionDetails.
# Set to nil if the current one is a DefinitionTerm or DefinitionList.
def update_state(state = %State{}, _),
do: state |> State.set(:definition_term_id_without_details, nil)
# If two definition terms directly follow up on eachother, the previous
# one has no details. Therefore set a finding for the previous one.
@impl true
def validate(
resource = %DefinitionTerm{},
state = %NLdoc.Validation.State{definition_term_id_without_details: id}
)
when not is_nil(id),
do:
state
|> NLdoc.Validation.State.prepend(:findings, make_finding(id))
|> update_state(resource)
def validate(resource, state = %NLdoc.Validation.State{}),
do: state |> update_state(resource)
end