module Hadolint.Rule.DL3056 (rule) where

import Data.Either
import qualified Data.Map as Map
import qualified Data.SemVer as SemVer
import qualified Data.Text as Text
import Hadolint.Rule
import Language.Docker.Syntax


rule :: LabelSchema -> Rule args
rule :: LabelSchema -> Rule args
rule LabelSchema
labelschema = [Rule args] -> Rule args
forall a. Monoid a => [a] -> a
mconcat ([Rule args] -> Rule args) -> [Rule args] -> Rule args
forall a b. (a -> b) -> a -> b
$
  (LabelName -> Rule args) -> [LabelName] -> [Rule args]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LabelName -> Rule args
forall args. LabelName -> Rule args
labelIsNotSemVerRule (LabelSchema -> [LabelName]
forall k a. Map k a -> [k]
Map.keys ((LabelType -> Bool) -> LabelSchema -> LabelSchema
forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (LabelType -> LabelType -> Bool
forall a. Eq a => a -> a -> Bool
== LabelType
SemVer) LabelSchema
labelschema))
{-# INLINEABLE rule #-}

labelIsNotSemVerRule :: LabelName -> Rule args
labelIsNotSemVerRule :: LabelName -> Rule args
labelIsNotSemVerRule LabelName
label = RuleCode
-> DLSeverity
-> LabelName
-> (Instruction args -> Bool)
-> Rule args
forall args.
RuleCode
-> DLSeverity
-> LabelName
-> (Instruction args -> Bool)
-> Rule args
simpleRule RuleCode
code DLSeverity
severity LabelName
message Instruction args -> Bool
forall args. Instruction args -> Bool
check
  where
    code :: RuleCode
code = RuleCode
"DL3056"
    severity :: DLSeverity
severity = DLSeverity
DLWarningC
    message :: LabelName
message = String -> LabelName
Text.pack String
"Label `" LabelName -> LabelName -> LabelName
forall a. Semigroup a => a -> a -> a
<> LabelName
label LabelName -> LabelName -> LabelName
forall a. Semigroup a => a -> a -> a
<> String -> LabelName
Text.pack String
"` does not conform to semantic versioning."
    check :: Instruction args -> Bool
check (Label Pairs
pairs) = LabelName -> Pairs -> Bool
hasNoBadVersioning LabelName
label Pairs
pairs
    check Instruction args
_ = Bool
True

hasNoBadVersioning :: LabelName -> Pairs -> Bool
hasNoBadVersioning :: LabelName -> Pairs -> Bool
hasNoBadVersioning LabelName
lbl Pairs
prs = Pairs -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(LabelName
l, LabelName
v) | (LabelName
l, LabelName
v) <- Pairs
prs, LabelName
l LabelName -> LabelName -> Bool
forall a. Eq a => a -> a -> Bool
== LabelName
lbl,
                                            Either String Version -> Bool
forall a b. Either a b -> Bool
isLeft (Either String Version -> Bool) -> Either String Version -> Bool
forall a b. (a -> b) -> a -> b
$ LabelName -> Either String Version
SemVer.fromText LabelName
v]