base16
Copyright(c) 2020-2026 Emily Pillmore
LicenseBSD-style
MaintainerEmily Pillmore <emilypi@cohomolo.gy>
Stabilitystable
Portabilitynon-portable
Safe HaskellNone
LanguageHaskell2010

Data.Text.Short.Encoding.Base16

Description

This module contains ShortText-valued combinators for implementing the RFC 4648 specification of the Base16 encoding format. This includes lenient decoding variants, as well as internal and external validation for canonicity.

Synopsis

Documentation

encodeBase16 :: ShortText -> Base16 ShortText Source #

Encode a ShortText value in Base16.

See: RFC-4648 section 8

Examples:

>>> encodeBase16 "Sun"
"53756e"

decodeBase16 :: Base16 ShortText -> ShortText Source #

Decode a Base16-encoded ShortText value.

See: RFC-4648 section 8

Examples:

>>> decodeBase16 $ assertBase16 "53756e"
"Sun"

decodeBase16Untyped :: ShortText -> Either Text ShortText Source #

Decode an untyped Base16-encoded ShortText value.

See: RFC-4648 section 8

Examples:

>>> decodeBase16Untyped "53756e"
Right "Sun"
>>> decodeBase16Untyped "6x"
Left "invalid character at offset: 1"

decodeBase16With Source #

Arguments

:: (ShortByteString -> Either err ShortText)

convert a bytestring to text (e.g. decodeUtf8')

-> ShortByteString

Input to decode

-> Either (Base16Error err) ShortText 

Attempt to decode an untyped ShortText value as Base16, converting from ByteString to ShortText according to some encoding function. In practice, This is something like decodeUtf8', which may produce an error.

See: RFC-4648 section 8

Example:

decodeBase16With (fmap fromText . decodeUtf8' . fromShort)
  :: ShortByteString -> Either (Base16Error UnicodeException) ShortText

Since: 0.3.0.0

decodeBase16Lenient :: ShortText -> ShortText Source #

Decode an untyped Base16-encoded ShortText value leniently.

Non-hexadecimal characters and a final unpaired hex digit are ignored. Valid UTF-8 sequences are preserved. Each invalid UTF-8 byte is interpreted as its Latin-1 character (U+0000 through U+00FF), ensuring the result is valid ShortText without raising Unicode exceptions.

N.B.: this is not RFC 4648-compliant.

Examples:

>>> decodeBase16Lenient "53756e"
"Sun"
>>> decodeBase16Lenient "6x6x"
"f"

parseBase16 :: ShortText -> Either Text (Base16 ShortText) Source #

Validate an untyped Base16 value and retain its encoded representation.

Accepts even-length ASCII hexadecimal input, including upper-case and mixed-case digits. Empty input is valid. The original input is preserved, and errors match decodeBase16Untyped.

This validates the Base16 encoding, not the UTF-8 validity of its decoded payload. Use decodeBase16With with a checked conversion for text decoding.

Examples:

>>> parseBase16 "666f6"
Left "invalid bytestring size"
>>> parseBase16 "666F"
Right "666F"
>>> fmap decodeBase16 (parseBase16 "666F")
Right "fo"
>>> parseBase16 "6x"
Left "invalid character at offset: 1"

Since: 2.0