module Ecluse.Core.Package.InvalidEntry (
InvalidEntry (invalidKind, invalidKey, invalidValue, invalidReason),
mkInvalidEntry,
InvalidEntryKind (..),
renderInvalidEntryKind,
dropCountsByKind,
) where
import Data.Aeson (Value (Array, Object, String))
import Data.Aeson.KeyMap qualified as KeyMap
import Data.Map.Strict qualified as Map
import Data.Text qualified as T
import Data.Vector qualified as V
import Ecluse.Core.Security.Authority (authorityLabel)
data InvalidEntry = InvalidEntry
{ InvalidEntry -> InvalidEntryKind
invalidKind :: InvalidEntryKind
, InvalidEntry -> Text
invalidKey :: Text
, InvalidEntry -> Value
invalidValue :: Value
, InvalidEntry -> Text
invalidReason :: Text
}
deriving stock (InvalidEntry -> InvalidEntry -> Bool
(InvalidEntry -> InvalidEntry -> Bool)
-> (InvalidEntry -> InvalidEntry -> Bool) -> Eq InvalidEntry
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InvalidEntry -> InvalidEntry -> Bool
== :: InvalidEntry -> InvalidEntry -> Bool
$c/= :: InvalidEntry -> InvalidEntry -> Bool
/= :: InvalidEntry -> InvalidEntry -> Bool
Eq, Int -> InvalidEntry -> ShowS
[InvalidEntry] -> ShowS
InvalidEntry -> String
(Int -> InvalidEntry -> ShowS)
-> (InvalidEntry -> String)
-> ([InvalidEntry] -> ShowS)
-> Show InvalidEntry
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InvalidEntry -> ShowS
showsPrec :: Int -> InvalidEntry -> ShowS
$cshow :: InvalidEntry -> String
show :: InvalidEntry -> String
$cshowList :: [InvalidEntry] -> ShowS
showList :: [InvalidEntry] -> ShowS
Show)
mkInvalidEntry :: InvalidEntryKind -> Text -> Value -> Text -> InvalidEntry
mkInvalidEntry :: InvalidEntryKind -> Text -> Value -> Text -> InvalidEntry
mkInvalidEntry InvalidEntryKind
kind Text
key Value
value Text
reason =
InvalidEntry
{ invalidKind :: InvalidEntryKind
invalidKind = InvalidEntryKind
kind
, invalidKey :: Text
invalidKey = Text -> Text
redactUrlText Text
key
, invalidValue :: Value
invalidValue = Value -> Value
redactUrls Value
value
, invalidReason :: Text
invalidReason = Text
reason
}
redactUrls :: Value -> Value
redactUrls :: Value -> Value
redactUrls = \case
String Text
s -> Text -> Value
String (Text -> Text
redactUrlText Text
s)
Object Object
o -> Object -> Value
Object ((Value -> Value) -> Object -> Object
forall a b. (a -> b) -> KeyMap a -> KeyMap b
KeyMap.map Value -> Value
redactUrls Object
o)
Array Array
xs -> Array -> Value
Array ((Value -> Value) -> Array -> Array
forall a b. (a -> b) -> Vector a -> Vector b
V.map Value -> Value
redactUrls Array
xs)
Value
scalar -> Value
scalar
redactUrlText :: Text -> Text
redactUrlText :: Text -> Text
redactUrlText Text
raw
| Text
"://" Text -> Text -> Bool
`T.isInfixOf` Text
raw = Text -> Text
authorityLabel Text
raw
| Bool
otherwise = Text
raw
data InvalidEntryKind
=
InvalidVersionManifest
|
InvalidDistTag
|
InvalidPublishTime
|
InvalidIndexFile
|
InvalidVersionListing
deriving stock (InvalidEntryKind -> InvalidEntryKind -> Bool
(InvalidEntryKind -> InvalidEntryKind -> Bool)
-> (InvalidEntryKind -> InvalidEntryKind -> Bool)
-> Eq InvalidEntryKind
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InvalidEntryKind -> InvalidEntryKind -> Bool
== :: InvalidEntryKind -> InvalidEntryKind -> Bool
$c/= :: InvalidEntryKind -> InvalidEntryKind -> Bool
/= :: InvalidEntryKind -> InvalidEntryKind -> Bool
Eq, Eq InvalidEntryKind
Eq InvalidEntryKind =>
(InvalidEntryKind -> InvalidEntryKind -> Ordering)
-> (InvalidEntryKind -> InvalidEntryKind -> Bool)
-> (InvalidEntryKind -> InvalidEntryKind -> Bool)
-> (InvalidEntryKind -> InvalidEntryKind -> Bool)
-> (InvalidEntryKind -> InvalidEntryKind -> Bool)
-> (InvalidEntryKind -> InvalidEntryKind -> InvalidEntryKind)
-> (InvalidEntryKind -> InvalidEntryKind -> InvalidEntryKind)
-> Ord InvalidEntryKind
InvalidEntryKind -> InvalidEntryKind -> Bool
InvalidEntryKind -> InvalidEntryKind -> Ordering
InvalidEntryKind -> InvalidEntryKind -> InvalidEntryKind
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: InvalidEntryKind -> InvalidEntryKind -> Ordering
compare :: InvalidEntryKind -> InvalidEntryKind -> Ordering
$c< :: InvalidEntryKind -> InvalidEntryKind -> Bool
< :: InvalidEntryKind -> InvalidEntryKind -> Bool
$c<= :: InvalidEntryKind -> InvalidEntryKind -> Bool
<= :: InvalidEntryKind -> InvalidEntryKind -> Bool
$c> :: InvalidEntryKind -> InvalidEntryKind -> Bool
> :: InvalidEntryKind -> InvalidEntryKind -> Bool
$c>= :: InvalidEntryKind -> InvalidEntryKind -> Bool
>= :: InvalidEntryKind -> InvalidEntryKind -> Bool
$cmax :: InvalidEntryKind -> InvalidEntryKind -> InvalidEntryKind
max :: InvalidEntryKind -> InvalidEntryKind -> InvalidEntryKind
$cmin :: InvalidEntryKind -> InvalidEntryKind -> InvalidEntryKind
min :: InvalidEntryKind -> InvalidEntryKind -> InvalidEntryKind
Ord, Int -> InvalidEntryKind -> ShowS
[InvalidEntryKind] -> ShowS
InvalidEntryKind -> String
(Int -> InvalidEntryKind -> ShowS)
-> (InvalidEntryKind -> String)
-> ([InvalidEntryKind] -> ShowS)
-> Show InvalidEntryKind
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InvalidEntryKind -> ShowS
showsPrec :: Int -> InvalidEntryKind -> ShowS
$cshow :: InvalidEntryKind -> String
show :: InvalidEntryKind -> String
$cshowList :: [InvalidEntryKind] -> ShowS
showList :: [InvalidEntryKind] -> ShowS
Show)
renderInvalidEntryKind :: InvalidEntryKind -> Text
renderInvalidEntryKind :: InvalidEntryKind -> Text
renderInvalidEntryKind = \case
InvalidEntryKind
InvalidVersionManifest -> Text
"version-manifest"
InvalidEntryKind
InvalidDistTag -> Text
"dist-tag"
InvalidEntryKind
InvalidPublishTime -> Text
"publish-time"
InvalidEntryKind
InvalidIndexFile -> Text
"index-file"
InvalidEntryKind
InvalidVersionListing -> Text
"version-listing"
dropCountsByKind :: [InvalidEntry] -> Map Text Int
dropCountsByKind :: [InvalidEntry] -> Map Text Int
dropCountsByKind [InvalidEntry]
entries =
(Int -> Int -> Int) -> [(Text, Int)] -> Map Text Int
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) [(InvalidEntryKind -> Text
renderInvalidEntryKind (InvalidEntry -> InvalidEntryKind
invalidKind InvalidEntry
e), Int
1) | InvalidEntry
e <- [InvalidEntry]
entries]