File: THField.hs

package info (click to toggle)
haskelldb 0.9.cvs.601-5
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 680 kB
  • ctags: 35
  • sloc: haskell: 4,392; sh: 1,792; makefile: 143
file content (59 lines) | stat: -rw-r--r-- 1,986 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
-----------------------------------------------------------
-- |
-- Module      :  Query
-- Copyright   :  HWT Group (c) 2003, dp03-7@mdstud.chalmers.se
-- License     :  BSD-style
-- 
-- Maintainer  :  dp03-7@mdstud.chalmers.se
-- Stability   :  experimental
-- Portability :  non-portable (requires Template Haskell)
--
-- Provides a Template Haskell function that declares
-- a HaskellDB field.
-- 
-- $Revision: 1.2 $
-----------------------------------------------------------
module THField (field, module Database.HaskellDB.DBLayout) where

import Database.HaskellDB.DBLayout
import Language.Haskell.THSyntax

-- | Declare a field.
field :: String  -- ^ Haskell identifier for the field (e.g. "xid")
      -> String  -- ^ Actual field name (e.g. "id")
      -> String  -- ^ Name of the field label type (e.g. "Id")
      -> Bool    -- ^ Whether the field is nullable
      -> String  -- ^ Name of the value type of the field (e.g. "Int")
      -> Q [Dec]
field attrName fieldName tagName nullable typeName 
    = return $ mkField attrName fieldName tagName nullable typeName 

mkField :: String -> String -> String -> Bool -> String -> [Dec]
mkField attrName fieldName tagName nullable typeName = 
    [
     mkTag tagName, 
     mkFieldTagInstance tagName fieldName, 
     mkAttrSig attrName tagName nullable typeName, 
     mkAttrVal attrName tagName
    ]

mkTag tagName = DataD [] tagName [] [NormalC tagName []] []

mkFieldTagInstance tagName fieldName = 
    InstanceD [] (AppT (ConT "FieldTag") (ConT tagName)) 
		  [FunD "fieldName" 
		   [Clause [WildP] (NormalB (LitE (StringL fieldName))) []]]

mkAttrSig attrName tagName nullable typeName 
    = SigD attrName (AppT (AppT 
			   (ConT "Attr") 
			   (ConT tagName)) (mkType nullable typeName))

mkType nullable typeName = if nullable then AppT (ConT "Maybe") t else t
    where t = ConT typeName

mkAttrVal attrName tagName = 
    ValD (VarP attrName) (NormalB 
			  (AppE (VarE "mkAttr") 
			   (ConE tagName))) []