Current section

Files

Jump to
nerves_system_linter lib nerves system linter rule checks.ex
Raw

lib/nerves/system/linter/rule/checks.ex

defmodule Nerves.System.Linter.Rule.Checks do
@moduledoc "Actual check implementation for the Callbacks module."
alias Nerves.System.Defconfig
alias Nerves.System.Linter.Rule.Callbacks
@doc "Ensures a package is enabled."
@spec ensure_package(Defconfig.t, Defconfig.config_name, Callbacks.args) :: Defconfig.t
def ensure_package(defconfig, package_name, opts \\ [])
def ensure_package(
%Defconfig{config: config} = defconfig,
<<"BR2_PACKAGE_", _rest::binary>> = package_name,
opts
) do
res = config[package_name] || false
message = Keyword.get(opts, :message, "ensure_package: #{package_name}: #{res || false}")
update(defconfig, res, message, opts)
end
def ensure_package(%Defconfig{} = defconfig, package_name, opts) do
ensure_package(defconfig, "BR2_PACKAGE_" <> package_name, opts)
end
@doc "Ensures a boolean value."
@spec ensure_bool(Defconfig.t, Defconfig.config_name, boolean, Callbacks.args) :: Defconfig.t
def ensure_bool(%Defconfig{} = defconfig, config, bool, opts \\ []) do
res = config in Map.keys(defconfig.config) and defconfig.config[config] == bool
message = Keyword.get(opts, :message, "ensure_bool: #{config}: #{res || false}")
update(defconfig, res, message, opts)
end
@doc "Ensures a value."
@spec ensure_value(Defconfig.t, Defconfig.config_name, Defconfig.package_value, Callbacks.args) :: Defconfig.t
def ensure_value(%Defconfig{} = defconfig, config, value, opts \\ []) do
res = defconfig.config[config] == value
message = Keyword.get(opts, :message, "ensure_value: #{config}: #{res || false}")
update(defconfig, res, message, opts)
end
def ensure_value_match(defconfig, package_name, pattern, opts \\ []) do
pattern = Code.eval_string(pattern)
expr = defconfig.config[package_name]
quoted = quote do
case {unquote(expr), []} do
unquote(pattern) ->
true
_ ->
false
end
end
{res, _env} = Code.eval_quoted(quoted)
update(defconfig, res, "ensure_value_match: #{package_name}: #{res || false}", opts)
end
@spec update(Defconfig.t, boolean, Callbacks.message, Callbacks.args) :: Defconfig.t
defp update(defconfig, res, message, opts) do
warn? = Keyword.get(opts, :warn, false)
cond do
res -> %{defconfig | success: [message | defconfig.success]}
warn? and !res -> %{defconfig | warnings: [message | defconfig.warnings]}
true -> %{defconfig | errors: [message | defconfig.errors]}
end
end
end