module Ecluse.Core.Registry.WireSupport (
partitionLenient,
NameAgreement (..),
checkNameAgreement,
) where
import Data.Aeson (Value)
import Data.Map.Strict qualified as Map
import Ecluse.Core.Package (
InvalidEntry (InvalidEntry),
InvalidEntryKind,
PackageName,
renderPackageName,
)
partitionLenient :: InvalidEntryKind -> (Value -> Either String a) -> Map Text Value -> (Map Text a, [InvalidEntry])
partitionLenient :: forall a.
InvalidEntryKind
-> (Value -> Either String a)
-> Map Text Value
-> (Map Text a, [InvalidEntry])
partitionLenient InvalidEntryKind
kind Value -> Either String a
decode =
(Text
-> Value
-> (Map Text a, [InvalidEntry])
-> (Map Text a, [InvalidEntry]))
-> (Map Text a, [InvalidEntry])
-> Map Text Value
-> (Map Text a, [InvalidEntry])
forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
Map.foldrWithKey Text
-> Value
-> (Map Text a, [InvalidEntry])
-> (Map Text a, [InvalidEntry])
step (Map Text a
forall k a. Map k a
Map.empty, [])
where
step :: Text
-> Value
-> (Map Text a, [InvalidEntry])
-> (Map Text a, [InvalidEntry])
step Text
key Value
value (Map Text a
kept, [InvalidEntry]
dropped) = case Value -> Either String a
decode Value
value of
Right a
a -> (Text -> a -> Map Text a -> Map Text a
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Text
key a
a Map Text a
kept, [InvalidEntry]
dropped)
Left String
err -> (Map Text a
kept, InvalidEntryKind -> Text -> Value -> Text -> InvalidEntry
InvalidEntry InvalidEntryKind
kind Text
key Value
value (String -> Text
forall a. ToText a => a -> Text
toText String
err) InvalidEntry -> [InvalidEntry] -> [InvalidEntry]
forall a. a -> [a] -> [a]
: [InvalidEntry]
dropped)
data NameAgreement
=
NameAgrees
|
NameDisagrees Text
deriving stock (NameAgreement -> NameAgreement -> Bool
(NameAgreement -> NameAgreement -> Bool)
-> (NameAgreement -> NameAgreement -> Bool) -> Eq NameAgreement
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NameAgreement -> NameAgreement -> Bool
== :: NameAgreement -> NameAgreement -> Bool
$c/= :: NameAgreement -> NameAgreement -> Bool
/= :: NameAgreement -> NameAgreement -> Bool
Eq, Int -> NameAgreement -> ShowS
[NameAgreement] -> ShowS
NameAgreement -> String
(Int -> NameAgreement -> ShowS)
-> (NameAgreement -> String)
-> ([NameAgreement] -> ShowS)
-> Show NameAgreement
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NameAgreement -> ShowS
showsPrec :: Int -> NameAgreement -> ShowS
$cshow :: NameAgreement -> String
show :: NameAgreement -> String
$cshowList :: [NameAgreement] -> ShowS
showList :: [NameAgreement] -> ShowS
Show)
checkNameAgreement :: PackageName -> PackageName -> NameAgreement
checkNameAgreement :: PackageName -> PackageName -> NameAgreement
checkNameAgreement PackageName
requestedName PackageName
reportedName
| PackageName
reportedName PackageName -> PackageName -> Bool
forall a. Eq a => a -> a -> Bool
== PackageName
requestedName = NameAgreement
NameAgrees
| Bool
otherwise = Text -> NameAgreement
NameDisagrees (PackageName -> Text
renderPackageName PackageName
reportedName)