module Hadolint.Rule.DL3059 (rule) where

import Hadolint.Rule
import Language.Docker.Syntax


data Acc
  = Acc RunFlags
  | Empty
  deriving (Acc -> Acc -> Bool
(Acc -> Acc -> Bool) -> (Acc -> Acc -> Bool) -> Eq Acc
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Acc -> Acc -> Bool
$c/= :: Acc -> Acc -> Bool
== :: Acc -> Acc -> Bool
$c== :: Acc -> Acc -> Bool
Eq, Int -> Acc -> ShowS
[Acc] -> ShowS
Acc -> String
(Int -> Acc -> ShowS)
-> (Acc -> String) -> ([Acc] -> ShowS) -> Show Acc
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Acc] -> ShowS
$cshowList :: [Acc] -> ShowS
show :: Acc -> String
$cshow :: Acc -> String
showsPrec :: Int -> Acc -> ShowS
$cshowsPrec :: Int -> Acc -> ShowS
Show)

rule :: Rule args
rule :: Rule args
rule = (Int -> State Acc -> Instruction args -> State Acc)
-> State Acc -> Rule args
forall a args.
(Int -> State a -> Instruction args -> State a)
-> State a -> Rule args
customRule Int -> State Acc -> Instruction args -> State Acc
forall args. Int -> State Acc -> Instruction args -> State Acc
check (Acc -> State Acc
forall a. a -> State a
emptyState Acc
Empty)
  where
    code :: RuleCode
code = RuleCode
"DL3059"
    severity :: DLSeverity
severity = DLSeverity
DLInfoC
    message :: Text
message = Text
"Multiple consecutive `RUN` instructions. Consider consolidation."

    check :: Int -> State Acc -> Instruction args -> State Acc
check Int
line State Acc
st (Run (RunArgs Arguments args
_ RunFlags
flags))
      | State Acc -> Acc
forall a. State a -> a
state State Acc
st Acc -> Acc -> Bool
forall a. Eq a => a -> a -> Bool
== RunFlags -> Acc
Acc RunFlags
flags = State Acc
st State Acc -> (State Acc -> State Acc) -> State Acc
forall a b. a -> (a -> b) -> b
|> CheckFailure -> State Acc -> State Acc
forall a. CheckFailure -> State a -> State a
addFail CheckFailure :: RuleCode -> DLSeverity -> Text -> Int -> CheckFailure
CheckFailure {Int
Text
RuleCode
DLSeverity
line :: Int
message :: Text
severity :: DLSeverity
code :: RuleCode
line :: Int
message :: Text
severity :: DLSeverity
code :: RuleCode
..}
      | Bool
otherwise = State Acc
st State Acc -> (State Acc -> State Acc) -> State Acc
forall a b. a -> (a -> b) -> b
|> (Acc -> Acc) -> State Acc -> State Acc
forall a. (a -> a) -> State a -> State a
modify (RunFlags -> Acc -> Acc
remember RunFlags
flags)
    check Int
_ State Acc
st Instruction args
_ = State Acc
st State Acc -> (State Acc -> State Acc) -> State Acc
forall a b. a -> (a -> b) -> b
|> (Acc -> Acc) -> State Acc -> State Acc
forall a. (a -> a) -> State a -> State a
modify Acc -> Acc
reset
{-# INLINEABLE rule #-}

remember :: RunFlags -> Acc -> Acc
remember :: RunFlags -> Acc -> Acc
remember RunFlags
flags Acc
_ = RunFlags -> Acc
Acc RunFlags
flags

reset :: Acc -> Acc
reset :: Acc -> Acc
reset Acc
_ = Acc
Empty