hsoz-0.0.1.0: src/Network/Iron/Util.hs
-- | Miscellaneous shortcut functions, mostly for internal use.
module Network.Iron.Util (
-- * Base64
b64
, b64dec
, b64url
, b64urldec
, b16
-- * Time parsing
, parseExpMsec
-- * Error handling
, justRight
, rightJust
) where
import Data.ByteArray (ByteArrayAccess)
import qualified Data.ByteArray.Encoding as B (Base (..), convertToBase, convertFromBase)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as S8
import Data.Monoid ((<>))
import Data.Time.Clock (NominalDiffTime)
import Text.Read (readMaybe)
-- | Shorthand for hex encode
b16 :: ByteString -> ByteString
b16 = B.convertToBase B.Base16
-- | Shorthand for encode in Base64.
b64 :: ByteArrayAccess a => a -> ByteString
b64 = B.convertToBase B.Base64
b64url :: ByteArrayAccess a => a -> ByteString
b64url = B.convertToBase B.Base64URLUnpadded
b64dec :: ByteArrayAccess a => a -> Either String ByteString
b64dec = B.convertFromBase B.Base64
b64urldec :: ByteString -> Either String ByteString
b64urldec = B.convertFromBase B.Base64URLUnpadded
-- | Reads a positive integer time value in milliseconds. This is for
-- parsing ttls or expiry times written as milliseconds since the unix
-- epoch.
parseExpMsec :: ByteString -> Maybe NominalDiffTime
parseExpMsec = (>>= fromMsec . guard) . readMaybe . S8.unpack
where
fromMsec = fmap ((/ 1000) . fromInteger)
-- ttls must be positive
guard n | n > 0 = Just n
| otherwise = Nothing
-- | Converts 'Either' to 'Maybe'.
rightJust :: Either e a -> Maybe a
rightJust (Right a) = Just a
rightJust _ = Nothing
-- | Converts 'Maybe' to 'Either'.
justRight :: e -> Maybe a -> Either e a
justRight _ (Just a) = Right a
justRight e Nothing = Left e