module Data.Conduit.OpenPGP.Keyring (
conduitToTKs
, conduitToTKsDropping
, sinkKeyringMap
) where
import Data.Conduit
import qualified Data.Conduit.List as CL
import Data.IxSet (empty, insert)
import Codec.Encryption.OpenPGP.KeyringParser (finalizeParsing, parseAChunk, parseTK)
import Codec.Encryption.OpenPGP.Types
import Data.Conduit.OpenPGP.Keyring.Instances ()
data Phase = MainKey | Revs | Uids | UAts | Subs | SkippingBroken
deriving (Eq, Ord, Show)
conduitToTKs :: Monad m => Conduit Pkt m TK
conduitToTKs = conduitToTKs' True
conduitToTKsDropping :: Monad m => Conduit Pkt m TK
conduitToTKsDropping = conduitToTKs' False
fakecmAccum :: Monad m => (accum -> (accum, [b])) -> (a -> accum -> (accum, [b])) -> accum -> Conduit a m b
fakecmAccum finalizer f =
loop
where
loop accum =
await >>= maybe (Prelude.mapM_ yield (snd (finalizer accum))) go
where
go a = do
let (accum', bs) = f a accum
Prelude.mapM_ yield bs
loop accum'
conduitToTKs' :: Monad m => Bool -> Conduit Pkt m TK
conduitToTKs' intolerant = CL.filter notTrustPacket =$= CL.map (:[]) =$= fakecmAccum finalizeParsing (parseAChunk (parseTK intolerant)) ([], Just (Nothing, parseTK intolerant)) =$= CL.catMaybes
where
notTrustPacket (TrustPkt _) = False
notTrustPacket _ = True
sinkKeyringMap :: Monad m => Sink TK m Keyring
sinkKeyringMap = CL.fold (flip insert) empty