git.iko.soy/typeable/postgresql-simple
on master help sign in
Add the toJSONField and fromJSONField functions

These can be used as the default implementations for the toField and fromField methods for Haskell types that have a JSON representation in PostgreSQL.

commitcb552f96c740a002117619e3d4c05f51313a1d8d authorBas van Dijk <v.dijk.bas@gmail.com> dateThu 12 Sep 2013, 00:49 (13 years ago) parent63a00b2
2 files changed+29
src/Database/PostgreSQL/Simple/FromField.hs+19 src/Database/PostgreSQL/Simple/ToField.hs+10
src/Database/PostgreSQL/Simple/FromField.hs+19
@@ -87,6 +87,8 @@ module Database.PostgreSQL.Simple.FromField
8787 , typeOid
8888 , PQ.Oid(..)
8989 , PQ.Format(..)
90+
91+ , fromJSONField
9092 ) where
9193
9294#include "MachDeps.h"
@@ -453,6 +455,23 @@ instance FromField JSON.Value where
453455 Left err -> returnError ConversionFailed f err
454456 Right val -> pure val
455457
458+-- | Parse a field to a JSON 'JSON.Value' and convert that into a
459+-- Haskell value using 'JSON.fromJSON'.
460+--
461+-- This can be used as the default implementation for the 'fromField'
462+-- method for Haskell types that have a JSON representation in
463+-- PostgreSQL.
464+--
465+-- The 'Typeable' constraint is required to show more informative
466+-- error messages when parsing fails.
467+fromJSONField :: (JSON.FromJSON a, Typeable a) => FieldParser a
468+fromJSONField f mbBs = do
469+ value <- fromField f mbBs
470+ case JSON.fromJSON value of
471+ JSON.Error err -> returnError ConversionFailed f $
472+ "JSON decoding error: " ++ err
473+ JSON.Success x -> pure x
474+
456475type Compat = PQ.Oid -> Bool
457476
458477okText, okText', okBinary, ok16, ok32, ok64, okInt :: Compat
src/Database/PostgreSQL/Simple/ToField.hs+10
@@ -18,6 +18,7 @@ module Database.PostgreSQL.Simple.ToField
1818 (
1919 Action(..)
2020 , ToField(..)
21+ , toJSONField
2122 , inQuotes
2223 ) where
2324
@@ -234,6 +235,15 @@ instance (ToField a) => ToField (Vector a) where
234235instance ToField JSON.Value where
235236 toField = toField . JSON.encode
236237
238+-- | Convert a Haskell value to a JSON 'JSON.Value' using
239+-- 'JSON.toJSON' and convert that to a field using 'toField'.
240+--
241+-- This can be used as the default implementation for the 'toField'
242+-- method for Haskell types that have a JSON representation in
243+-- PostgreSQL.
244+toJSONField :: JSON.ToJSON a => a -> Action
245+toJSONField = toField . JSON.toJSON
246+
237247-- | Surround a string with single-quote characters: \"@'@\"
238248--
239249-- This function /does not/ perform any other escaping.