{-# LANGUAGE FlexibleContexts #-}
module Serokell.Util.Parse.Base64
( base64
, base64Url
) where
import Universum hiding (fail)
import Control.Monad (fail)
import Text.Parsec.Char (char)
import Serokell.Util.Base64 (decode, decodeUrl)
import Serokell.Util.Parse.Common (CharParser, asciiAlphaNum)
base64 :: CharParser ByteString
base64 = do
str <- (++) <$> some (asciiAlphaNum <|> char '+' <|> char '/') <*> many (char '=')
case decode $ toText str of
Left e -> fail $ toString e
Right bs -> return bs
base64Url :: CharParser ByteString
base64Url = do
str <- (++) <$> some (asciiAlphaNum <|> char '_' <|> char '-') <*> many (char '=')
case decodeUrl $ toText str of
Left e -> fail $ toString e
Right bs -> return bs