5. Coding conventions
5.1. On the topic of cs
TL;DR:
use cs
only in test-suites, don’t use it in production code
In wire we use all types of Strings;
String ~ [Char]
(base
itself still does many things withString
, also we use it in the/integration
test suite)Text
in both its strict and lazy versionsByteString
in both its strict and lazy versions
ByteString
is literally a pointer to an Array of Bytes; there’s no inherent encoding that makes it safe to
convert from and to String
and Text
which are nowadays typically utf8
encoded; that means that using
cs :: ConvertibleStrings a b => a -> b
is not a safe operation; the encoding between a given ByteString
and a String
or Text
can be different; e.g. we could decode a ByteString
as ASCII-Chars or as utf8, just
to name a few.
There’s another inherent problem to cs
in that context, namely readability; a TL.fromStict
immediately tells
you what the code does; cs
, however, says nothing; you know there’s some conversion going on but not which.
We have hence decided to not use the error-prone and hard-to-read cs
in production code, i.e., in all libraries
and services, and instead only allow for use in test suites in general and integration/
more specifically.
As a consequence we also decided to drop cs
from Imports
.