packages feed

serokell-util-0.1.4.0: src/Serokell/Util/Parse/Base64.hs

{-# LANGUAGE FlexibleContexts #-}

-- | Parsing Base64

module Serokell.Util.Parse.Base64
       ( base64
       , base64Url
       ) where

import           Control.Applicative        (many, some, (<|>))
import qualified Data.ByteString            as BS
import           Data.Text                  (pack, unpack)
import           Serokell.Util.Base64       (decode, decodeUrl)
import           Serokell.Util.Parse.Common (CharParser, asciiAlphaNum)
import           Text.Parsec.Char           (char)

base64 :: CharParser BS.ByteString
base64 = do
  str <- (++) <$> some (asciiAlphaNum <|> char '+' <|> char '/') <*> many (char '=')
  case decode $ pack str of
    Left e   -> fail $ unpack e
    Right bs -> return bs

base64Url :: CharParser BS.ByteString
base64Url = do
  str <- (++) <$> some (asciiAlphaNum <|> char '_' <|> char '-') <*> many (char '=')
  case decodeUrl $ pack str of
    Left e   -> fail $ unpack e
    Right bs -> return bs