Skip to content

Commit 3ec2e10

Browse files
committed
derivePgEnum works fine
1 parent 1917cfd commit 3ec2e10

File tree

5 files changed

+62
-124
lines changed

5 files changed

+62
-124
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ cabal.sandbox.config
44
*~
55
TAGS
66
cabal.config
7+
.stack-work

example/Main.hs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
module Main where
2+
3+
import Data.Text (Text)
4+
import Data.Time
5+
import Database.PostgreSQL.Query
6+
import Text.Inflections
7+
8+
-- | Example enum type to check out how 'derivePgEnum' works
9+
data Species
10+
= Dog
11+
| Cat
12+
| Snake
13+
14+
derivePgEnum toUnderscore ''Species
15+
16+
-- | Example structure to check out how 'deriveFromRow' works
17+
data AnimalInfo = AnimalInfo
18+
{ _aiName :: Text
19+
, _aiSpecies :: Species
20+
, _aiBirtDay :: UTCTime
21+
}
22+
23+
deriveFromRow ''AnimalInfo
24+
deriveToRow ''AnimalInfo
25+
26+
main :: IO ()
27+
main = do
28+
return ()

postgresql-query.cabal

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,21 @@ test-suite test
115115
, tasty-hunit
116116
, tasty-quickcheck
117117
, tasty-th
118-
, text
118+
, text
119+
120+
test-suite example
121+
type: exitcode-stdio-1.0
122+
default-language: Haskell2010
123+
ghc-options: -Wall
124+
hs-source-dirs: example
125+
main-is: Main.hs
126+
127+
default-extensions: FlexibleInstances
128+
, OverloadedStrings
129+
, TemplateHaskell
130+
131+
build-depends: base
132+
, inflections
133+
, postgresql-query
134+
, text
135+
, time

src/Database/PostgreSQL/Query/TH/Enum.hs

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,36 @@
1-
{-# LANGUAGE OverloadedStrings #-}
2-
{-# LANGUAGE TemplateHaskell #-}
31

42
-- | Helps to map enum types to postgresql enums.
53
module Database.PostgreSQL.Query.TH.Enum
64
( derivePgEnum
7-
, GeneratorOptions(..)
5+
, InflectorFunc
86
) where
97

108
import Prelude
119

12-
import Data.Default
1310
import Data.FileEmbed
1411
import Database.PostgreSQL.Simple.FromField
1512
import Database.PostgreSQL.Simple.ToField
16-
import GHC.Generics (Generic)
1713
import Language.Haskell.TH
18-
import Text.Inflections
1914

2015
import qualified Data.Text.Encoding as T
2116
import qualified Data.Text as T
2217

2318
-- | Function to transform constructor name into its PG enum conterpart.
24-
-- It should have type 'String -> String'
2519
type InflectorFunc = String -> String
2620

27-
type Typ = Name
28-
29-
-- | Option record to pass to the TH generators.
30-
data GeneratorOptions
31-
= GeneratorOptions
32-
{ inflectorFunc :: InflectorFunc
33-
} deriving (Generic)
34-
35-
instance Default GeneratorOptions where
36-
def = GeneratorOptions toUnderscore
37-
3821
{-| derives 'FromField' and 'ToField' instances for a sum-type enum like
3922
4023
@
4124
data Entity = Red | Green | Blue
4225
@
4326
-}
44-
derivePgEnum :: GeneratorOptions
45-
-- ^ mapping function from haskell constructor name to PG enum label
46-
-> Typ
47-
-> DecsQ
48-
derivePgEnum (inflectorFunc -> infl) typeName = do
27+
derivePgEnum
28+
:: InflectorFunc
29+
-- ^ mapping function from haskell constructor name to PG enum label
30+
-> Name
31+
-- ^ type to derive instances for
32+
-> DecsQ
33+
derivePgEnum infl typeName = do
4934
info <- reify typeName
5035
case info of
5136
TyConI dec ->
@@ -64,7 +49,7 @@ derivePgEnum (inflectorFunc -> infl) typeName = do
6449
++ " in makePgEnumExplicit"
6550

6651
makeToField :: InflectorFunc
67-
-> Typ
52+
-> Name
6853
-> [Con]
6954
-> DecQ
7055
makeToField i typeName constr = do
@@ -75,7 +60,7 @@ makeToField i typeName constr = do
7560
[funD 'toField $ fmap pure clauses]
7661

7762
makeFromField :: InflectorFunc
78-
-> Typ
63+
-> Name
7964
-> [Con]
8065
-> Q Dec
8166
makeFromField i typeName enumCons = do

stack.yaml

Lines changed: 5 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,10 @@
1-
flags:
2-
text:
3-
integer-simple: false
1+
flags: {}
42
extra-package-dbs: []
53
packages:
64
- '.'
75
extra-deps:
8-
- MonadRandom-0.4
9-
- QuickCheck-2.8.1
10-
- StateVar-1.1.0.1
11-
- aeson-0.10.0.0
12-
- ansi-terminal-0.6.2.3
13-
- ansi-wl-pprint-0.6.7.3
14-
- async-2.0.2
15-
- attoparsec-0.13.0.1
16-
- auto-update-0.1.2.2
17-
- base-orphans-0.4.4
18-
- bifunctors-5
19-
- blaze-builder-0.4.0.1
20-
- bytestring-builder-0.10.6.0.0
21-
- case-insensitive-1.2.0.5
22-
- clock-0.5.1
23-
- comonad-4.2.7.2
24-
- conduit-1.2.5.1
25-
- conduit-extra-1.1.9.1
26-
- contravariant-1.3.3
27-
- cpphs-1.19.3
28-
- data-default-0.5.3
29-
- data-default-class-0.0.1
30-
- data-default-instances-base-0.0.1
31-
- data-default-instances-containers-0.0.1
32-
- data-default-instances-dlist-0.0.1
33-
- data-default-instances-old-locale-0.0.1
34-
- distributive-0.4.4
35-
- dlist-0.7.1.2
36-
- either-4.4.1
37-
- exceptions-0.8.0.2
38-
- fast-logger-2.4.1
39-
- file-embed-0.0.9
40-
- free-4.12.1
41-
- hashable-1.2.3.3
42-
- haskell-src-exts-1.16.0.1
43-
- haskell-src-meta-0.6.0.11
44-
- hreader-1.0.1
45-
- hset-2.1.0
46-
- ieee754-0.7.6
47-
- inflections-0.2.0.0
48-
- language-haskell-extract-0.2.4
49-
- lifted-base-0.2.3.6
50-
- mmorph-1.0.4
51-
- monad-control-1.0.0.4
52-
- monad-logger-0.3.15
53-
- monad-loops-0.4.3
54-
- mtl-2.2.1
55-
- nats-1
56-
- network-2.6.2.1
57-
- old-locale-1.0.0.7
58-
- old-time-1.1.0.3
59-
- optparse-applicative-0.12.0.0
60-
- parsec-3.1.9
61-
- polyparse-1.11
62-
- postgresql-libpq-0.9.1.1
63-
- postgresql-simple-0.5.1.0
64-
- prelude-extras-0.4.0.2
65-
- primitive-0.6.1.0
66-
- profunctors-5.1.1
67-
- quickcheck-assertions-0.2.0
68-
- quickcheck-instances-0.3.11
69-
- random-1.1
70-
- regex-base-0.93.2
71-
- regex-posix-0.95.2
72-
- regex-tdfa-rc-1.1.8.3
73-
- resource-pool-0.2.3.2
74-
- resourcet-1.1.6
75-
- safe-0.3.9
76-
- scientific-0.3.4.2
77-
- semigroupoids-5.0.0.4
78-
- semigroups-0.17.0.1
79-
- stm-2.4.4
80-
- stm-chans-3.0.0.4
81-
- streaming-commons-0.1.14.2
82-
- syb-0.6
83-
- tagged-0.8.1
84-
- tasty-0.11.0.1
85-
- tasty-hunit-0.9.2
86-
- tasty-quickcheck-0.8.4
87-
- tasty-th-0.1.3
88-
- text-1.2.1.3
89-
- tf-random-0.5
90-
- th-expand-syns-0.3.0.6
91-
- th-lift-0.7.2
6+
- hreader-1.0.2
7+
- hset-2.2.0
928
- th-lift-instances-0.1.6
93-
- th-orphans-0.12.2
94-
- th-reify-many-0.1.3
95-
- transformers-base-0.4.4
96-
- transformers-compat-0.4.0.4
97-
- unbounded-delays-0.1.0.9
98-
- unordered-containers-0.2.5.1
99-
- uuid-types-1.0.2
100-
- vector-0.11.0.0
101-
- void-0.7.1
102-
- zlib-0.6.1.1
103-
resolver: ghc-7.10.2
9+
- type-fun-0.0.1
10+
resolver: lts-3.20

0 commit comments

Comments
 (0)