hadolint-2.0.0: src/Hadolint/Rule/DL3048.hs
module Hadolint.Rule.DL3048 (rule) where
import qualified Data.Text as Text
import Hadolint.Rule
import Language.Docker.Syntax
rule :: Rule args
rule = simpleRule code severity message check
where
code = "DL3048"
severity = DLStyleC
message = "Invalid label key."
check (Label pairs) = hasNoInvalidKey pairs
check _ = True
hasNoInvalidKey prs = null $ [(l, v) | (l, v) <- prs,
Text.take 1 l `notElem`
fmap Text.singleton ['a'..'z'] ||
Text.takeEnd 1 l `notElem`
fmap Text.singleton (['a'..'z'] ++ ['0'..'9']) ||
containsIllegalChar l ||
hasReservedNamespace l ||
hasConsecutiveSeparators l]
{-# INLINEABLE rule #-}
containsIllegalChar :: Text.Text -> Bool
containsIllegalChar = Text.any (`notElem` validChars)
hasReservedNamespace :: Text.Text -> Bool
hasReservedNamespace l = "com.docker." `Text.isPrefixOf` l
|| "io.docker." `Text.isPrefixOf` l
|| "org.dockerproject." `Text.isPrefixOf` l
hasConsecutiveSeparators :: Text.Text -> Bool
hasConsecutiveSeparators l = ".." `Text.isInfixOf` l || "--" `Text.isInfixOf` l
validChars :: String
validChars = ['0'..'9'] ++ ['a' .. 'z'] ++ ['.', '-']