This class teaches Persistent how to take a custom type and marshal it to and from a PersistValue, allowing it to be stored in a database.
Examples
Simple Newtype
You can use newtype to add more type safety/readability to a basis type like ByteString. In these cases, just derive PersistField and PersistFieldSql:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype HashedPassword = HashedPassword ByteString
deriving (Eq, Show, PersistField, PersistFieldSql)
Smart Constructor Newtype
In this example, we create a PersistField instance for a newtype following the "Smart Constructor" pattern.
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import qualified Data.Text as T
import qualified Data.Char as C
-- | An American Social Security Number
newtype SSN = SSN Text
deriving (Eq, Show, PersistFieldSql)
mkSSN :: Text -> Either Text SSN
mkSSN t = if (T.length t == 9) && (T.all C.isDigit t)
then Right $ SSN t
else Left $ "Invalid SSN: " <> t
instance PersistField SSN where
toPersistValue (SSN t) = PersistText t
fromPersistValue (PersistText t) = mkSSN t
-- Handle cases where the database does not give us PersistText
fromPersistValue x = Left $ "File.hs: When trying to deserialize an SSN: expected PersistText, received: " <> T.pack (show x)
Tips:
This file contain dozens of PersistField instances you can look at for examples.
Typically custom PersistField instances will only accept a single PersistValue constructor in fromPersistValue.
Internal PersistField instances accept a wide variety of PersistValues to accomodate e.g. storing booleans as integers, booleans or strings.
If you're making a custom instance and using a SQL database, you'll also need
PersistFieldSqlto specify the type of the database column.
Methods
toPersistValue :: a -> PersistValuefromPersistValue :: PersistValue -> Either Text a
Instances38PersistField, …
TypeError ((((('TextDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistField"The instance of PersistField for the Natural type was removed."
':$$: 'Text"Please see the documentation for OverflowNatural if you want to "
) ':$$: 'Text"continue using the old behavior or want to see documentation on "
) ':$$: 'Text"why the instance was removed."
) ':$$: 'Text""
) ':$$: 'Text"This error instance will be removed in a future release."
) => PersistField NaturalPersistField HtmlDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField ByteStringDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField Int16Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField Int32Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField Int64Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField Int8Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField RationalDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField Word16Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField Word32Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField Word64Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField Word8Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField BoolDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField DoubleDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField IntDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField WordDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField OverflowNaturalDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField PersistValueDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField CheckmarkDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField TextDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField TextDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField DayDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField UTCTimeDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField TimeOfDayDefined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField (BackendKey SqlReadBackend)Defined in persistent-2.14.6.3 · Database.Persist.Sql.Orphan.PersistStore · orphanPersistField (BackendKey SqlWriteBackend)Defined in persistent-2.14.6.3 · Database.Persist.Sql.Orphan.PersistStore · orphanPersistField (BackendKey SqlBackend)Defined in persistent-2.14.6.3 · Database.Persist.Sql.Orphan.PersistStore · orphanPersistField [Char]Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField a => PersistField (Maybe a)Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField a => PersistField (Vector a)Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField a => PersistField [a]Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField v => PersistField (IntMap v)Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistField(Ord a, PersistField a) => PersistField (Set a)Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistField(PersistEntity record, PersistField record, PersistField (Key record)) => PersistField (Entity record)Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistEntity(BackendCompatible b s, PersistField (BackendKey b)) => PersistField (BackendKey (Compatible b s))Defined in persistent-2.14.6.3 · Database.Persist.Compatible.TypesHasResolution a => PersistField (Fixed a)Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistFieldPersistField v => PersistField (Map Text v)Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistField(PersistField a, PersistField b) => PersistField (a, b)Defined in persistent-2.14.6.3 · Database.Persist.Class.PersistField