about summary refs log tree commit diff
path: root/users/Profpatsch/whatcd-resolver/src/Postgres/Decoder.hs
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2023-07-16T20·10+0200
committerProfpatsch <mail@profpatsch.de>2023-07-16T20·15+0000
commit57bab040edbad11689740487eb68de865862361b (patch)
tree38a8b01f2eb80758e4eb42f607cf03688713b35f /users/Profpatsch/whatcd-resolver/src/Postgres/Decoder.hs
parent6ecc7a2ee47c8e860140cef3f8d8e37d9ecabcf3 (diff)
chore(users/Profpatsch): move utils to my-prelude r/6429
I want to use these in multiple projects.

Change-Id: I5dfdad8614bc5835e59df06f724de78acae78d42
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8971
Reviewed-by: Profpatsch <mail@profpatsch.de>
Tested-by: BuildkiteCI
Diffstat (limited to 'users/Profpatsch/whatcd-resolver/src/Postgres/Decoder.hs')
-rw-r--r--users/Profpatsch/whatcd-resolver/src/Postgres/Decoder.hs58
1 files changed, 0 insertions, 58 deletions
diff --git a/users/Profpatsch/whatcd-resolver/src/Postgres/Decoder.hs b/users/Profpatsch/whatcd-resolver/src/Postgres/Decoder.hs
deleted file mode 100644
index 2e7fcb8779ed..000000000000
--- a/users/Profpatsch/whatcd-resolver/src/Postgres/Decoder.hs
+++ /dev/null
@@ -1,58 +0,0 @@
-module Postgres.Decoder where
-
-import Control.Applicative (Alternative)
-import Data.Aeson qualified as Json
-import Data.Aeson.BetterErrors qualified as Json
-import Data.Error.Tree
-import Data.Typeable (Typeable)
-import Database.PostgreSQL.Simple.FromField qualified as PG
-import Database.PostgreSQL.Simple.FromRow qualified as PG
-import Json qualified
-import Label
-import PossehlAnalyticsPrelude
-
--- | A Decoder of postgres values. Allows embedding more complex parsers (like a 'Json.ParseT').
-newtype Decoder a = Decoder (PG.RowParser a)
-  deriving newtype (Functor, Applicative, Alternative, Monad)
-
--- | Turn any type that implements 'PG.fromField' into a 'Decoder'. Use type applications to prevent accidental conversions:
---
--- @
--- fromField @Text :: Decoder Text
--- @
-fromField :: PG.FromField a => Decoder a
-fromField = Decoder $ PG.fieldWith PG.fromField
-
--- | Turn any type that implements 'PG.fromField' into a 'Decoder' and wrap the result into the given 'Label'. Use type applications to prevent accidental conversions:
---
--- @
--- fromField @"myField" @Text :: Decoder (Label "myField" Text)
--- @
-fromFieldLabel :: forall lbl a. PG.FromField a => Decoder (Label lbl a)
-fromFieldLabel = label @lbl <$> fromField
-
--- | Parse fields out of a json value returned from the database.
---
--- ATTN: The whole json record has to be transferred before it is parsed,
--- so if you only need a tiny bit of it, use `->` and `->>` in your SQL statement
--- and return only the fields you need from the query.
---
--- In that case pay attention to NULL though:
---
--- @
--- SELECT '{"foo": {}}'::jsonb->>'foo' IS NULL
--- → TRUE
--- @
---
--- Also note: `->>` will coerce the json value to @text@, regardless of the content.
--- So the JSON object @{"foo": {}}"@ would be returned as the text: @"{\"foo\": {}}"@.
-json :: Typeable a => Json.ParseT ErrorTree Identity a -> Decoder a
-json parser = Decoder $ PG.fieldWith $ \field bytes -> do
-  val <- PG.fromField @Json.Value field bytes
-  case Json.parseValue parser val of
-    Left err ->
-      PG.returnError
-        PG.ConversionFailed
-        field
-        (err & Json.parseErrorTree "Cannot decode jsonb column" & prettyErrorTree & textToString)
-    Right a -> pure a