This package provides the necessary functions and types to decode/encode OsStrings from/to a JSON value using the aeson library.
Defining a FromJSON OsString or ToJSON OsString instance is not as
unambiguous as -- for example -- one for FilePath: Since the latter is a
Unicode string there is a one-to-one correspondence to JSON strings, which are
UTF-8 encoded 1. In contrast to that, an OsString is an arbitrary bytestring
with no encoding information attached.
A consequence of that fact is that the instances for OsString involve design
decisions based on the use case. Those are summarized in the blog post
"The ultimate guide to Haskell Strings" by Julian Ospald, the author of the
os-string library 2:
- Convert to String (e.g. by assuming UTF-8 or UTF-16), use the existing ToJSON instance and hope the receiver knows how to interpret the data.
- If you're dealing with binary data, you can convert to e.g. base64 String or Text and then again use the existing instances (there’s the base64-bytestring-type library that does this via a newtype).
- Convert the byte sequence to [Word8], which has a valid instance as well.
Following that, this library provides
-
the
fromText/toTextfamily of functions and a newtype wrapperAs ('Text Unicode) OsStringsuitable to implement solution (1). -
the
fromBase64/toBase64family of functions and a newtype wrapperAs 'Base64 OsStringsuitable to implement solution (2). -
the
fromBinary/toBinaryfamily of functions and a newtype wrapperAs 'Binary OsStringsuitable to implement solution (3).
In addition to that, a tagged version of the encodings above is supported: That is, instead of e.g. decoding from or encoding to a simple JSON string, an object like
{
"platform": "Posix",
"data": "some OsString here"
}is used to encode additional information to the OsString in question.
The package includes the same API for OsString, PosixString and
WindowsString:
Data.OsString.Aesonprovides the API for OsString .Data.OsString.Aeson.Posixprovides the API for PosixString .Data.OsString.Aeson.Windowsprovides the API for WindowsString .
The examples for the different approaches can be found in the in the
examples
directory:
-
Functions.hsdemonstrates how to use functions to construct decoding/encoding functions manually. -
HKD1.hsdemonstrates how to use the newtype wrappers provided by this library together with the Higher-Kinded Data pattern (HKD) usingFunctors. -
HKD2.hsalso demonstrates how to use the newtype wrappers in a HKD setting, but uses a type family to determine the representation of the datatype's fields.
The support window of this library is 3 years. That means there should be a build plan for:
- Any major GHC version published within the last 3 years.
- Any version of a dependency published within the last 3 years.