base-encoding (empty) → 0.1.0.0
raw patch · 7 files changed
+1077/−0 lines, 7 filesdep +basedep +base16-bytestringdep +base64-bytestringsetup-changed
Dependencies added: base, base16-bytestring, base64-bytestring, bytestring, text
Files
- LICENSE +30/−0
- Setup.hs +2/−0
- base-encoding.cabal +55/−0
- src/Codec/Base16.hs +325/−0
- src/Codec/Base64.hs +317/−0
- src/Codec/Base64Url.hs +318/−0
- src/Internal.hs +30/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2017, Herbert Valerio Riedel++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ base-encoding.cabal view
@@ -0,0 +1,55 @@+cabal-version: 1.12+name: base-encoding+version: 0.1.0.0++synopsis: Binary-to-text encodings (e.g. base64)+license: BSD3+license-file: LICENSE+author: Herbert Valerio Riedel+bug-reports: https://github.com/hvr/base-encoding/issues+maintainer: hvr@gnu.org+category: Text+build-type: Simple+description:+ This package provides a simple and convenient API to encode and+ decode binary data in the popular binary-to-text \"base\" encoding+ family as described in [RFC 4648](https://tools.ietf.org/html/rfc4648) et al.+ .+ Currently, the following encodings are supported:+ .+ - base16 (RFC4648)+ - base64 (RFC4648)+ - base64url (RFC4648)++source-repository head+ type: git+ location: https://github.com/hvr/base-encoding++library+ hs-source-dirs: src++ exposed-modules:+ Codec.Base16+ Codec.Base64+ Codec.Base64Url++ other-modules:+ Internal++ default-language: Haskell2010+ other-extensions: CPP MultiParamTypeClasses++ if impl(ghc >= 7.4)+ default-extensions: Trustworthy+ if impl(ghc >= 7.10)+ ghc-options: -fno-warn-trustworthy-safe++ build-depends:+ base >=4.3 && <4.12+ , base16-bytestring >=0.1.1.6 && <0.2+ , base64-bytestring >=1.0.0.1 && <1.1++ , bytestring >=0.9.1 && <0.11+ , text >=1.2.3 && <1.3++ ghc-options: -Wall
+ src/Codec/Base16.hs view
@@ -0,0 +1,325 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE MultiParamTypeClasses #-}++-- | This module provides access to the \"base16\" binary-to-text encoding as defined by [RFC 4648](https://tools.ietf.org/html/rfc4648).+--+-- This module is intended to be imported @qualified@, e.g.+--+-- > import qualified Codec.Base16 as B16+--+-- If you want to explictly specify which 'Encode' and 'Decode' typeclass instance is used, you can use plain Haskell2010 type-signature annotations, e.g.+--+-- >>> (B16.encode :: ByteString -> Text) "\202\254"+-- "cafe"+--+-- >>> (B16.decode :: Text -> Either String ShortByteString) "CaFe"+-- Right "\202\254"+--+-- Alternatively, starting with GHC 8.0.1, you can also use the [TypeApplications language extension](https://downloads.haskell.org/~ghc/8.4.1/docs/html/users_guide/glasgow_exts.html#ghc-flag--XTypeApplications):+--+-- >>> B16.encode @ShortByteString @Text "\xFF\239\0"+-- "ffef00"+--+-- >>> B16.decode @Text @ShortByteString ""+-- Right ""+--+-- @since 0.1.0.0+module Codec.Base16+ ( Encode(encode)+ , Decode(decode)+ ) where++import qualified Data.ByteString.Base16 as B16+import qualified Data.ByteString.Base16.Lazy as B16.L++import qualified Data.ByteString as BS+#if MIN_VERSION_bytestring(0,10,2)+import qualified Data.ByteString.Builder as BB+#elif MIN_VERSION_bytestring(0,10,0)+import qualified Data.ByteString.Lazy.Builder as BB+#endif+import qualified Data.ByteString.Lazy as BS.L+#if MIN_VERSION_bytestring(0,10,4)+import qualified Data.ByteString.Short as SBS+#endif++import qualified Data.Text as T (Text)+import qualified Data.Text.Encoding as T (decodeLatin1, encodeUtf8)+import qualified Data.Text.Lazy as T.L (Text, fromStrict)+import qualified Data.Text.Lazy.Builder as TB (Builder, fromLazyText,+ fromText, toLazyText)+import qualified Data.Text.Lazy.Encoding as T.L (decodeLatin1, encodeUtf8)++import Internal++-- primitives++decodeBs2Bs :: BS.ByteString -> Either String BS.ByteString+decodeBs2Bs txt+ | BS.null rest = Right $! b+ | otherwise = Left ("invalid base16 encoding near offset " ++ show (2 * BS.length b))+ where+ (b,rest) = B16.decode txt++decodeBsL2BsL :: BS.L.ByteString -> Either String BS.L.ByteString+decodeBsL2BsL txt+ | BS.L.null rest = Right $! b+ | otherwise = Left ("invalid base16 encoding near offset " ++ show (2 * BS.L.length b))+ where+ (b,rest) = B16.L.decode txt++encodeBs2Bs :: BS.ByteString -> BS.ByteString+encodeBs2Bs = B16.encode++encodeBsL2BsL :: BS.L.ByteString -> BS.L.ByteString+encodeBsL2BsL = B16.L.encode++----------------------------------------------------------------------------+-- exposed API++-- | Typeclass representing types for which a binary-to-text @base16@ encoding is defined+class Encode bin txt where+ -- | Encode binary data using @base16@ text encoding+ encode :: bin -> txt++-- | Typeclass representing types for which a text-to-binary @base16@ decoding is defined+class Decode txt bin where+ -- | Decode binary data encoded textually as @base16@+ decode :: txt -> Either String bin++----------------------------------------------------------------------------+-- instance matrix++---- lazy BS -> *++-- PRIMITIVE+instance Encode BS.L.ByteString BS.L.ByteString where+ encode = encodeBsL2BsL++instance Encode BS.L.ByteString BS.ByteString where+ encode = bsToStrict . encode++#if MIN_VERSION_bytestring(0,10,0)+instance Encode BS.L.ByteString BB.Builder where+ encode = BB.lazyByteString . encode+#endif++#if MIN_VERSION_bytestring(0,10,4)+instance Encode BS.L.ByteString SBS.ShortByteString where+ encode = SBS.toShort . encode+#endif++instance Encode BS.L.ByteString T.Text where+ encode = T.decodeLatin1 . encode++instance Encode BS.L.ByteString T.L.Text where+ encode = T.L.decodeLatin1 . encode++instance Encode BS.L.ByteString TB.Builder where+ encode = TB.fromLazyText . encode++---- strict BS -> *++-- PRIMITIVE+instance Encode BS.ByteString BS.ByteString where+ encode = encodeBs2Bs++instance Encode BS.ByteString BS.L.ByteString where+ encode = bsFromStrict . encode++#if MIN_VERSION_bytestring(0,10,0)+instance Encode BS.ByteString BB.Builder where+ encode = BB.byteString . encode+#endif++#if MIN_VERSION_bytestring(0,10,4)+instance Encode BS.ByteString SBS.ShortByteString where+ encode = SBS.toShort . encode+#endif++instance Encode BS.ByteString T.Text where+ encode = T.decodeLatin1 . encode++instance Encode BS.ByteString T.L.Text where+ encode = T.L.fromStrict . T.decodeLatin1 . encode++instance Encode BS.ByteString TB.Builder where+ encode = TB.fromText . encode++---- short BS -> *++#if MIN_VERSION_bytestring(0,10,4)+instance Encode SBS.ShortByteString SBS.ShortByteString where+ encode = SBS.toShort . encode . SBS.fromShort++instance Encode SBS.ShortByteString BS.ByteString where+ encode = encode . SBS.fromShort++instance Encode SBS.ShortByteString BS.L.ByteString where+ encode = encode . SBS.fromShort++instance Encode SBS.ShortByteString BB.Builder where+ encode = encode . SBS.fromShort++instance Encode SBS.ShortByteString T.Text where+ encode = T.decodeLatin1 . encode++instance Encode SBS.ShortByteString T.L.Text where+ encode = T.L.fromStrict . T.decodeLatin1 . encode++instance Encode SBS.ShortByteString TB.Builder where+ encode = TB.fromText . encode+#endif++---- BB -> *++#if MIN_VERSION_bytestring(0,10,4)+instance Encode BB.Builder SBS.ShortByteString where+ encode = encode . BB.toLazyByteString+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Encode BB.Builder BB.Builder where+ encode = encode . BB.toLazyByteString++instance Encode BB.Builder BS.ByteString where+ encode = encode . BB.toLazyByteString++instance Encode BB.Builder BS.L.ByteString where+ encode = encode . BB.toLazyByteString++instance Encode BB.Builder T.Text where+ encode = T.decodeLatin1 . encode++instance Encode BB.Builder T.L.Text where+ encode = T.L.decodeLatin1 . encode++instance Encode BB.Builder TB.Builder where+ encode = TB.fromLazyText . encode+#endif++------------------------------------------------------------------------------++-- PRIMITIVE+instance Decode BS.ByteString BS.ByteString where+ decode = decodeBs2Bs++instance Decode BS.ByteString BS.L.ByteString where+ decode = fmap bsFromStrict . decode++#if MIN_VERSION_bytestring(0,10,4)+instance Decode BS.ByteString SBS.ShortByteString where+ decode = fmap SBS.toShort . decode+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode BS.ByteString BB.Builder where+ decode = fmap BB.byteString . decode+#endif++----++-- PRIMITIVE+instance Decode BS.L.ByteString BS.L.ByteString where+ decode = decodeBsL2BsL++instance Decode BS.L.ByteString BS.ByteString where+ decode = fmap bsToStrict . decode++#if MIN_VERSION_bytestring(0,10,4)+instance Decode BS.L.ByteString SBS.ShortByteString where+ decode = fmap SBS.toShort . decode+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode BS.L.ByteString BB.Builder where+ decode = fmap BB.byteString . decode+#endif++----++#if MIN_VERSION_bytestring(0,10,4)+instance Decode SBS.ShortByteString SBS.ShortByteString where+ decode = fmap SBS.toShort . decode . SBS.fromShort++instance Decode SBS.ShortByteString BS.ByteString where+ decode = decode . SBS.fromShort++instance Decode SBS.ShortByteString BS.L.ByteString where+ decode = decode . SBS.fromShort++instance Decode SBS.ShortByteString BB.Builder where+ decode = decode . SBS.fromShort+#endif++----++#if MIN_VERSION_bytestring(0,10,4)+instance Decode BB.Builder SBS.ShortByteString where+ decode = decode . BB.toLazyByteString+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode BB.Builder BS.L.ByteString where+ decode = decode . BB.toLazyByteString++instance Decode BB.Builder BS.ByteString where+ decode = decode . BB.toLazyByteString++instance Decode BB.Builder BB.Builder where+ decode = decode . BB.toLazyByteString+#endif++----++instance Decode T.Text BS.ByteString where+ decode = decode . T.encodeUtf8++instance Decode T.Text BS.L.ByteString where+ decode = decode . T.encodeUtf8++#if MIN_VERSION_bytestring(0,10,4)+instance Decode T.Text SBS.ShortByteString where+ decode = decode . T.encodeUtf8+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode T.Text BB.Builder where+ decode = decode . T.encodeUtf8+#endif++----++instance Decode T.L.Text BS.ByteString where+ decode = decode . T.L.encodeUtf8++instance Decode T.L.Text BS.L.ByteString where+ decode = decode . T.L.encodeUtf8++#if MIN_VERSION_bytestring(0,10,4)+instance Decode T.L.Text SBS.ShortByteString where+ decode = decode . T.L.encodeUtf8+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode T.L.Text BB.Builder where+ decode = decode . T.L.encodeUtf8+#endif++----++instance Decode TB.Builder BS.ByteString where+ decode = decode . TB.toLazyText++instance Decode TB.Builder BS.L.ByteString where+ decode = decode . TB.toLazyText++#if MIN_VERSION_bytestring(0,10,4)+instance Decode TB.Builder SBS.ShortByteString where+ decode = decode . TB.toLazyText+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode TB.Builder BB.Builder where+ decode = decode . TB.toLazyText+#endif
+ src/Codec/Base64.hs view
@@ -0,0 +1,317 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE MultiParamTypeClasses #-}++-- | This module provides access to the \"base64\" binary-to-text encoding as defined by [RFC 4648](https://tools.ietf.org/html/rfc4648).+--+-- This module is intended to be imported @qualified@, e.g.+--+-- > import qualified Codec.Base64 as B64+--+-- If you want to explictly specify which 'Encode' and 'Decode' typeclass instance is used, you can use plain Haskell2010 type-signature annotations, e.g.+--+-- >>> (B64.encode :: ByteString -> Text) "\x00\x00"+-- "AAA="+--+-- >>> (B64.decode :: Text -> Either String ShortByteString) "NDoyMA=="+-- Right "4:20"+--+-- Alternatively, starting with GHC 8.0.1, you can also use the [TypeApplications language extension](https://downloads.haskell.org/~ghc/8.4.1/docs/html/users_guide/glasgow_exts.html#ghc-flag--XTypeApplications):+--+-- >>> B64.encode @ShortByteString @Text "\xFF\239"+-- "/+8="+--+-- >>> B64.decode @Text @ShortByteString "/+8="+-- Right "\255\239"+--+-- @since 0.1.0.0+module Codec.Base64+ ( Encode(encode)+ , Decode(decode)+ ) where++import qualified Data.ByteString.Base64 as B64+import qualified Data.ByteString.Base64.Lazy as B64.L++import qualified Data.ByteString as BS+#if MIN_VERSION_bytestring(0,10,2)+import qualified Data.ByteString.Builder as BB+#elif MIN_VERSION_bytestring(0,10,0)+import qualified Data.ByteString.Lazy.Builder as BB+#endif+import qualified Data.ByteString.Lazy as BS.L+#if MIN_VERSION_bytestring(0,10,4)+import qualified Data.ByteString.Short as SBS+#endif++import qualified Data.Text as T (Text)+import qualified Data.Text.Encoding as T (decodeLatin1, encodeUtf8)+import qualified Data.Text.Lazy as T.L (Text, fromStrict)+import qualified Data.Text.Lazy.Builder as TB (Builder, fromLazyText,+ fromText, toLazyText)+import qualified Data.Text.Lazy.Encoding as T.L (decodeLatin1, encodeUtf8)++import Internal++-- primitives++decodeBs2Bs :: BS.ByteString -> Either String BS.ByteString+decodeBs2Bs = B64.decode++decodeBsL2BsL :: BS.L.ByteString -> Either String BS.L.ByteString+decodeBsL2BsL = B64.L.decode++encodeBs2Bs :: BS.ByteString -> BS.ByteString+encodeBs2Bs = B64.encode++encodeBsL2BsL :: BS.L.ByteString -> BS.L.ByteString+encodeBsL2BsL = B64.L.encode++----------------------------------------------------------------------------+-- exposed API++-- | Typeclass representing types for which a binary-to-text @base64@ encoding is defined+class Encode bin txt where+ -- | Encode binary data using @base64@ text encoding+ encode :: bin -> txt++-- | Typeclass representing types for which a text-to-binary @base64@ decoding is defined+class Decode txt bin where+ -- | Decode binary data encoded textually as @base64@+ decode :: txt -> Either String bin++----------------------------------------------------------------------------+-- instance matrix++---- lazy BS -> *++-- PRIMITIVE+instance Encode BS.L.ByteString BS.L.ByteString where+ encode = encodeBsL2BsL++instance Encode BS.L.ByteString BS.ByteString where+ encode = bsToStrict . encode++#if MIN_VERSION_bytestring(0,10,0)+instance Encode BS.L.ByteString BB.Builder where+ encode = BB.lazyByteString . encode+#endif++#if MIN_VERSION_bytestring(0,10,4)+instance Encode BS.L.ByteString SBS.ShortByteString where+ encode = SBS.toShort . encode+#endif++instance Encode BS.L.ByteString T.Text where+ encode = T.decodeLatin1 . encode++instance Encode BS.L.ByteString T.L.Text where+ encode = T.L.decodeLatin1 . encode++instance Encode BS.L.ByteString TB.Builder where+ encode = TB.fromLazyText . encode++---- strict BS -> *++-- PRIMITIVE+instance Encode BS.ByteString BS.ByteString where+ encode = encodeBs2Bs++instance Encode BS.ByteString BS.L.ByteString where+ encode = bsFromStrict . encode++#if MIN_VERSION_bytestring(0,10,0)+instance Encode BS.ByteString BB.Builder where+ encode = BB.byteString . encode+#endif++#if MIN_VERSION_bytestring(0,10,4)+instance Encode BS.ByteString SBS.ShortByteString where+ encode = SBS.toShort . encode+#endif++instance Encode BS.ByteString T.Text where+ encode = T.decodeLatin1 . encode++instance Encode BS.ByteString T.L.Text where+ encode = T.L.fromStrict . T.decodeLatin1 . encode++instance Encode BS.ByteString TB.Builder where+ encode = TB.fromText . encode++---- short BS -> *++#if MIN_VERSION_bytestring(0,10,4)+instance Encode SBS.ShortByteString SBS.ShortByteString where+ encode = SBS.toShort . encode . SBS.fromShort++instance Encode SBS.ShortByteString BS.ByteString where+ encode = encode . SBS.fromShort++instance Encode SBS.ShortByteString BS.L.ByteString where+ encode = encode . SBS.fromShort++instance Encode SBS.ShortByteString BB.Builder where+ encode = encode . SBS.fromShort++instance Encode SBS.ShortByteString T.Text where+ encode = T.decodeLatin1 . encode++instance Encode SBS.ShortByteString T.L.Text where+ encode = T.L.fromStrict . T.decodeLatin1 . encode++instance Encode SBS.ShortByteString TB.Builder where+ encode = TB.fromText . encode+#endif++---- BB -> *++#if MIN_VERSION_bytestring(0,10,4)+instance Encode BB.Builder SBS.ShortByteString where+ encode = encode . BB.toLazyByteString+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Encode BB.Builder BB.Builder where+ encode = encode . BB.toLazyByteString++instance Encode BB.Builder BS.ByteString where+ encode = encode . BB.toLazyByteString++instance Encode BB.Builder BS.L.ByteString where+ encode = encode . BB.toLazyByteString++instance Encode BB.Builder T.Text where+ encode = T.decodeLatin1 . encode++instance Encode BB.Builder T.L.Text where+ encode = T.L.decodeLatin1 . encode++instance Encode BB.Builder TB.Builder where+ encode = TB.fromLazyText . encode+#endif++------------------------------------------------------------------------------++-- PRIMITIVE+instance Decode BS.ByteString BS.ByteString where+ decode = decodeBs2Bs++instance Decode BS.ByteString BS.L.ByteString where+ decode = fmap bsFromStrict . decode++#if MIN_VERSION_bytestring(0,10,4)+instance Decode BS.ByteString SBS.ShortByteString where+ decode = fmap SBS.toShort . decode+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode BS.ByteString BB.Builder where+ decode = fmap BB.byteString . decode+#endif++----++-- PRIMITIVE+instance Decode BS.L.ByteString BS.L.ByteString where+ decode = decodeBsL2BsL++instance Decode BS.L.ByteString BS.ByteString where+ decode = fmap bsToStrict . decode++#if MIN_VERSION_bytestring(0,10,4)+instance Decode BS.L.ByteString SBS.ShortByteString where+ decode = fmap SBS.toShort . decode+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode BS.L.ByteString BB.Builder where+ decode = fmap BB.byteString . decode+#endif++----++#if MIN_VERSION_bytestring(0,10,4)+instance Decode SBS.ShortByteString SBS.ShortByteString where+ decode = fmap SBS.toShort . decode . SBS.fromShort++instance Decode SBS.ShortByteString BS.ByteString where+ decode = decode . SBS.fromShort++instance Decode SBS.ShortByteString BS.L.ByteString where+ decode = decode . SBS.fromShort++instance Decode SBS.ShortByteString BB.Builder where+ decode = decode . SBS.fromShort+#endif++----++#if MIN_VERSION_bytestring(0,10,4)+instance Decode BB.Builder SBS.ShortByteString where+ decode = decode . BB.toLazyByteString+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode BB.Builder BS.L.ByteString where+ decode = decode . BB.toLazyByteString++instance Decode BB.Builder BS.ByteString where+ decode = decode . BB.toLazyByteString++instance Decode BB.Builder BB.Builder where+ decode = decode . BB.toLazyByteString+#endif++----++instance Decode T.Text BS.ByteString where+ decode = decode . T.encodeUtf8++instance Decode T.Text BS.L.ByteString where+ decode = decode . T.encodeUtf8++#if MIN_VERSION_bytestring(0,10,4)+instance Decode T.Text SBS.ShortByteString where+ decode = decode . T.encodeUtf8+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode T.Text BB.Builder where+ decode = decode . T.encodeUtf8+#endif++----++instance Decode T.L.Text BS.ByteString where+ decode = decode . T.L.encodeUtf8++instance Decode T.L.Text BS.L.ByteString where+ decode = decode . T.L.encodeUtf8++#if MIN_VERSION_bytestring(0,10,4)+instance Decode T.L.Text SBS.ShortByteString where+ decode = decode . T.L.encodeUtf8+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode T.L.Text BB.Builder where+ decode = decode . T.L.encodeUtf8+#endif++----++instance Decode TB.Builder BS.ByteString where+ decode = decode . TB.toLazyText++instance Decode TB.Builder BS.L.ByteString where+ decode = decode . TB.toLazyText++#if MIN_VERSION_bytestring(0,10,4)+instance Decode TB.Builder SBS.ShortByteString where+ decode = decode . TB.toLazyText+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode TB.Builder BB.Builder where+ decode = decode . TB.toLazyText+#endif
+ src/Codec/Base64Url.hs view
@@ -0,0 +1,318 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE MultiParamTypeClasses #-}++-- | This module provides access to the \"base64url\" binary-to-text encoding as defined by [RFC 4648](https://tools.ietf.org/html/rfc4648).+--+-- This module is intended to be imported @qualified@, e.g.+--+-- > import qualified Codec.Base64Url as B64+--+-- If you want to explictly specify which 'Encode' and 'Decode' typeclass instance is used, you can use plain Haskell2010 type-signature annotations, e.g.+--+-- >>> (B64.encode :: ByteString -> Text) "\x00\x00"+-- "AAA="+--+-- >>> (B64.decode :: Text -> Either String ShortByteString) "NDoyMA=="+-- Right "4:20"+--+-- Alternatively, starting with GHC 8.0.1, you can also use the [TypeApplications language extension](https://downloads.haskell.org/~ghc/8.4.1/docs/html/users_guide/glasgow_exts.html#ghc-flag--XTypeApplications):+--+-- >>> B64.encode @ShortByteString @Text "\xFF\239"+-- "_-8="+--+-- >>> B64.decode @Text @ShortByteString "_-8="+-- Right "\255\239"+--+-- @since 0.1.0.0+module Codec.Base64Url+ ( Encode(encode)+ , Decode(decode)+ ) where++import qualified Data.ByteString.Base64.URL as B64+import qualified Data.ByteString.Base64.URL.Lazy as B64.L++import qualified Data.ByteString as BS+#if MIN_VERSION_bytestring(0,10,2)+import qualified Data.ByteString.Builder as BB+#elif MIN_VERSION_bytestring(0,10,0)+import qualified Data.ByteString.Lazy.Builder as BB+#endif+import qualified Data.ByteString.Lazy as BS.L+#if MIN_VERSION_bytestring(0,10,4)+import qualified Data.ByteString.Short as SBS+#endif++import qualified Data.Text as T (Text)+import qualified Data.Text.Encoding as T (decodeLatin1, encodeUtf8)+import qualified Data.Text.Lazy as T.L (Text, fromStrict)+import qualified Data.Text.Lazy.Builder as TB (Builder, fromLazyText,+ fromText, toLazyText)+import qualified Data.Text.Lazy.Encoding as T.L (decodeLatin1,+ encodeUtf8)++import Internal++-- primitives++decodeBs2Bs :: BS.ByteString -> Either String BS.ByteString+decodeBs2Bs = B64.decode++decodeBsL2BsL :: BS.L.ByteString -> Either String BS.L.ByteString+decodeBsL2BsL = B64.L.decode++encodeBs2Bs :: BS.ByteString -> BS.ByteString+encodeBs2Bs = B64.encode++encodeBsL2BsL :: BS.L.ByteString -> BS.L.ByteString+encodeBsL2BsL = B64.L.encode++----------------------------------------------------------------------------+-- exposed API++-- | Typeclass representing types for which a binary-to-text @base64url@ encoding is defined+class Encode bin txt where+ -- | Encode binary data using @base64url@ text encoding+ encode :: bin -> txt++-- | Typeclass representing types for which a text-to-binary @base64url@ decoding is defined+class Decode txt bin where+ -- | Decode binary data encoded textually as @base64url@+ decode :: txt -> Either String bin++----------------------------------------------------------------------------+-- instance matrix++---- lazy BS -> *++-- PRIMITIVE+instance Encode BS.L.ByteString BS.L.ByteString where+ encode = encodeBsL2BsL++instance Encode BS.L.ByteString BS.ByteString where+ encode = bsToStrict . encode++#if MIN_VERSION_bytestring(0,10,0)+instance Encode BS.L.ByteString BB.Builder where+ encode = BB.lazyByteString . encode+#endif++#if MIN_VERSION_bytestring(0,10,4)+instance Encode BS.L.ByteString SBS.ShortByteString where+ encode = SBS.toShort . encode+#endif++instance Encode BS.L.ByteString T.Text where+ encode = T.decodeLatin1 . encode++instance Encode BS.L.ByteString T.L.Text where+ encode = T.L.decodeLatin1 . encode++instance Encode BS.L.ByteString TB.Builder where+ encode = TB.fromLazyText . encode++---- strict BS -> *++-- PRIMITIVE+instance Encode BS.ByteString BS.ByteString where+ encode = encodeBs2Bs++instance Encode BS.ByteString BS.L.ByteString where+ encode = bsFromStrict . encode++#if MIN_VERSION_bytestring(0,10,0)+instance Encode BS.ByteString BB.Builder where+ encode = BB.byteString . encode+#endif++#if MIN_VERSION_bytestring(0,10,4)+instance Encode BS.ByteString SBS.ShortByteString where+ encode = SBS.toShort . encode+#endif++instance Encode BS.ByteString T.Text where+ encode = T.decodeLatin1 . encode++instance Encode BS.ByteString T.L.Text where+ encode = T.L.fromStrict . T.decodeLatin1 . encode++instance Encode BS.ByteString TB.Builder where+ encode = TB.fromText . encode++---- short BS -> *++#if MIN_VERSION_bytestring(0,10,4)+instance Encode SBS.ShortByteString SBS.ShortByteString where+ encode = SBS.toShort . encode . SBS.fromShort++instance Encode SBS.ShortByteString BS.ByteString where+ encode = encode . SBS.fromShort++instance Encode SBS.ShortByteString BS.L.ByteString where+ encode = encode . SBS.fromShort++instance Encode SBS.ShortByteString BB.Builder where+ encode = encode . SBS.fromShort++instance Encode SBS.ShortByteString T.Text where+ encode = T.decodeLatin1 . encode++instance Encode SBS.ShortByteString T.L.Text where+ encode = T.L.fromStrict . T.decodeLatin1 . encode++instance Encode SBS.ShortByteString TB.Builder where+ encode = TB.fromText . encode+#endif++---- BB -> *++#if MIN_VERSION_bytestring(0,10,4)+instance Encode BB.Builder SBS.ShortByteString where+ encode = encode . BB.toLazyByteString+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Encode BB.Builder BB.Builder where+ encode = encode . BB.toLazyByteString++instance Encode BB.Builder BS.ByteString where+ encode = encode . BB.toLazyByteString++instance Encode BB.Builder BS.L.ByteString where+ encode = encode . BB.toLazyByteString++instance Encode BB.Builder T.Text where+ encode = T.decodeLatin1 . encode++instance Encode BB.Builder T.L.Text where+ encode = T.L.decodeLatin1 . encode++instance Encode BB.Builder TB.Builder where+ encode = TB.fromLazyText . encode+#endif++------------------------------------------------------------------------------++-- PRIMITIVE+instance Decode BS.ByteString BS.ByteString where+ decode = decodeBs2Bs++instance Decode BS.ByteString BS.L.ByteString where+ decode = fmap bsFromStrict . decode++#if MIN_VERSION_bytestring(0,10,4)+instance Decode BS.ByteString SBS.ShortByteString where+ decode = fmap SBS.toShort . decode+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode BS.ByteString BB.Builder where+ decode = fmap BB.byteString . decode+#endif++----++-- PRIMITIVE+instance Decode BS.L.ByteString BS.L.ByteString where+ decode = decodeBsL2BsL++instance Decode BS.L.ByteString BS.ByteString where+ decode = fmap bsToStrict . decode++#if MIN_VERSION_bytestring(0,10,4)+instance Decode BS.L.ByteString SBS.ShortByteString where+ decode = fmap SBS.toShort . decode+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode BS.L.ByteString BB.Builder where+ decode = fmap BB.byteString . decode+#endif++----++#if MIN_VERSION_bytestring(0,10,4)+instance Decode SBS.ShortByteString SBS.ShortByteString where+ decode = fmap SBS.toShort . decode . SBS.fromShort++instance Decode SBS.ShortByteString BS.ByteString where+ decode = decode . SBS.fromShort++instance Decode SBS.ShortByteString BS.L.ByteString where+ decode = decode . SBS.fromShort++instance Decode SBS.ShortByteString BB.Builder where+ decode = decode . SBS.fromShort+#endif++----++#if MIN_VERSION_bytestring(0,10,4)+instance Decode BB.Builder SBS.ShortByteString where+ decode = decode . BB.toLazyByteString+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode BB.Builder BS.L.ByteString where+ decode = decode . BB.toLazyByteString++instance Decode BB.Builder BS.ByteString where+ decode = decode . BB.toLazyByteString++instance Decode BB.Builder BB.Builder where+ decode = decode . BB.toLazyByteString+#endif++----++instance Decode T.Text BS.ByteString where+ decode = decode . T.encodeUtf8++instance Decode T.Text BS.L.ByteString where+ decode = decode . T.encodeUtf8++#if MIN_VERSION_bytestring(0,10,4)+instance Decode T.Text SBS.ShortByteString where+ decode = decode . T.encodeUtf8+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode T.Text BB.Builder where+ decode = decode . T.encodeUtf8+#endif++----++instance Decode T.L.Text BS.ByteString where+ decode = decode . T.L.encodeUtf8++instance Decode T.L.Text BS.L.ByteString where+ decode = decode . T.L.encodeUtf8++#if MIN_VERSION_bytestring(0,10,4)+instance Decode T.L.Text SBS.ShortByteString where+ decode = decode . T.L.encodeUtf8+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode T.L.Text BB.Builder where+ decode = decode . T.L.encodeUtf8+#endif++----++instance Decode TB.Builder BS.ByteString where+ decode = decode . TB.toLazyText++instance Decode TB.Builder BS.L.ByteString where+ decode = decode . TB.toLazyText++#if MIN_VERSION_bytestring(0,10,4)+instance Decode TB.Builder SBS.ShortByteString where+ decode = decode . TB.toLazyText+#endif++#if MIN_VERSION_bytestring(0,10,0)+instance Decode TB.Builder BB.Builder where+ decode = decode . TB.toLazyText+#endif
+ src/Internal.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE CPP #-}++module Internal+ ( bsToStrict+ , bsFromStrict+ , (<$>)+ ) where++#if !MIN_VERSION_base(4,8,0)+import Control.Applicative+#endif++import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as BS.L++{-# INLINE bsToStrict #-}+bsToStrict :: BS.L.ByteString -> BS.ByteString+#if MIN_VERSION_bytestring(0,10,0)+bsToStrict = BS.L.toStrict+#else+bsToStrict = BS.concat . BS.L.toChunks+#endif++{-# INLINE bsFromStrict #-}+bsFromStrict :: BS.ByteString -> BS.L.ByteString+#if MIN_VERSION_bytestring(0,10,0)+bsFromStrict = BS.L.fromStrict+#else+bsFromStrict = BS.L.fromChunks . (:[])+#endif