module Hadolint.Rule.DL3022 (rule) where

import qualified Data.Set as Set
import qualified Data.Text as Text
import Hadolint.Rule
import Language.Docker.Syntax

rule :: Rule args
rule :: forall args. Rule args
rule = (Linenumber
 -> State (Set Text) -> Instruction args -> State (Set Text))
-> State (Set Text) -> Rule args
forall a args.
(Linenumber -> State a -> Instruction args -> State a)
-> State a -> Rule args
customRule Linenumber
-> State (Set Text) -> Instruction args -> State (Set Text)
forall {args}.
Linenumber
-> State (Set Text) -> Instruction args -> State (Set Text)
check (Set Text -> State (Set Text)
forall a. a -> State a
emptyState Set Text
forall a. Set a
Set.empty)
  where
    code :: RuleCode
code = RuleCode
"DL3022"
    severity :: DLSeverity
severity = DLSeverity
DLWarningC
    message :: Text
message = Text
"`COPY --from` should reference a previously defined `FROM` alias"

    check :: Linenumber
-> State (Set Text) -> Instruction args -> State (Set Text)
check Linenumber
_ State (Set Text)
st (From BaseImage {alias :: BaseImage -> Maybe ImageAlias
alias = Just (ImageAlias Text
als)}) = State (Set Text)
st State (Set Text)
-> (State (Set Text) -> State (Set Text)) -> State (Set Text)
forall a b. a -> (a -> b) -> b
|> (Set Text -> Set Text) -> State (Set Text) -> State (Set Text)
forall a. (a -> a) -> State a -> State a
modify (Text -> Set Text -> Set Text
forall a. Ord a => a -> Set a -> Set a
Set.insert Text
als)
    check Linenumber
line State (Set Text)
st (Copy (CopyArgs NonEmpty SourcePath
_ TargetPath
_) (CopyFlags Chown
_ Chmod
_ Link
_ (CopySource Text
s)))
      | Text
":" Text -> Text -> Bool
`Text.isInfixOf` Text -> Text
dropQuotes Text
s = State (Set Text)
st
      | Text -> Set Text -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Text
s (State (Set Text) -> Set Text
forall a. State a -> a
state State (Set Text)
st) = State (Set Text)
st
      | Bool
otherwise = State (Set Text)
st State (Set Text)
-> (State (Set Text) -> State (Set Text)) -> State (Set Text)
forall a b. a -> (a -> b) -> b
|> CheckFailure -> State (Set Text) -> State (Set Text)
forall a. CheckFailure -> State a -> State a
addFail CheckFailure {Linenumber
Text
RuleCode
DLSeverity
code :: RuleCode
severity :: DLSeverity
message :: Text
line :: Linenumber
line :: Linenumber
message :: Text
severity :: DLSeverity
code :: RuleCode
..}
    check Linenumber
_ State (Set Text)
st Instruction args
_ = State (Set Text)
st
{-# INLINEABLE rule #-}