module Hadolint.Rule.DL3000 (rule) where import qualified Data.Char as Char import qualified Data.Text as Text import Hadolint.Rule import Language.Docker.Syntax (Instruction (..)) rule :: Rule args rule :: forall args. Rule args rule = forall args. RuleCode -> DLSeverity -> Text -> (Instruction args -> Bool) -> Rule args simpleRule RuleCode code DLSeverity severity Text message forall {args}. Instruction args -> Bool check where code :: RuleCode code = RuleCode "DL3000" severity :: DLSeverity severity = DLSeverity DLErrorC message :: Text message = Text "Use absolute WORKDIR" check :: Instruction args -> Bool check (Workdir Text loc) | Text "$" Text -> Text -> Bool `Text.isPrefixOf` Text -> Text dropQuotes Text loc = Bool True | Text "/" Text -> Text -> Bool `Text.isPrefixOf` Text -> Text dropQuotes Text loc = Bool True | Text -> Bool isWindowsAbsolute (Text -> Text dropQuotes Text loc) = Bool True | Bool otherwise = Bool False check Instruction args _ = Bool True {-# INLINEABLE rule #-} isWindowsAbsolute :: Text.Text -> Bool isWindowsAbsolute :: Text -> Bool isWindowsAbsolute Text path | Char -> Bool Char.isLetter (Text -> Int -> Char Text.index Text path Int 0) Bool -> Bool -> Bool && (Char ':' forall a. Eq a => a -> a -> Bool == Text -> Int -> Char Text.index Text path Int 1) = Bool True | Bool otherwise = Bool False