46 lines
1.4 KiB
Haskell
46 lines
1.4 KiB
Haskell
-- SPDX-FileCopyrightText: 2022-24 Gregor Kleen <gregor.kleen@ifi.lmu.de>, Steffen Jost <s.jost@fraport.de>
|
|
--
|
|
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
module Utils.Persist
|
|
( fromPersistValueError
|
|
, fromPersistValueErrorSql
|
|
, (~=.)
|
|
) where
|
|
|
|
import ClassyPrelude
|
|
|
|
import Database.Persist
|
|
import Database.Persist.Sql
|
|
import Data.Proxy
|
|
import Type.Reflection (typeRep)
|
|
|
|
|
|
fromPersistValueError :: Text -- ^ Haskell type
|
|
-> Text -- ^ Database type
|
|
-> PersistValue -- ^ Incorrect value
|
|
-> Text -- ^ Error Message
|
|
fromPersistValueError hType dbType received = mconcat
|
|
[ "Failed to parse Haskell type `"
|
|
, hType
|
|
, "`; expected "
|
|
, dbType
|
|
, " from database, but received: "
|
|
, tshow received
|
|
, "."
|
|
]
|
|
|
|
fromPersistValueErrorSql :: forall p a.
|
|
( PersistFieldSql a
|
|
, Typeable a
|
|
)
|
|
=> p a
|
|
-> PersistValue
|
|
-> Text
|
|
fromPersistValueErrorSql _ = fromPersistValueError (tshow $ typeRep @a) (tshow $ sqlType (Proxy @a))
|
|
|
|
|
|
infix 4 ~=.
|
|
-- | is Equal or Nothing, do not confuse with Database.Esqueleto.Utils(~=.) which does the same for proper Esqueleto queries
|
|
(~=.) :: PersistField a => EntityField v (Maybe a) -> a -> [Filter v]
|
|
(~=.) f v = [f ==. Just v] ||. [f ==. Nothing] |