Revision 185b5b0d
b/htools/Ganeti/THH.hs | ||
---|---|---|
236 | 236 |
appFn f x | f == VarE 'id = x |
237 | 237 |
| otherwise = AppE f x |
238 | 238 |
|
239 |
-- | Builds a field for a normal constructor. |
|
240 |
buildConsField :: Q Type -> StrictTypeQ |
|
241 |
buildConsField ftype = do |
|
242 |
ftype' <- ftype |
|
243 |
return (NotStrict, ftype') |
|
244 |
|
|
245 |
-- | Builds a constructor based on a simple definition (not field-based). |
|
246 |
buildSimpleCons :: Name -> SimpleObject -> Q Dec |
|
247 |
buildSimpleCons tname cons = do |
|
248 |
decl_d <- mapM (\(cname, fields) -> do |
|
249 |
fields' <- mapM (buildConsField . snd) fields |
|
250 |
return $ NormalC (mkName cname) fields') cons |
|
251 |
return $ DataD [] tname [] decl_d [''Show, ''Read, ''Eq] |
|
252 |
|
|
253 |
-- | Generate the save function for a given type. |
|
254 |
genSaveSimpleObj :: Name -- ^ Object type |
|
255 |
-> String -- ^ Function name |
|
256 |
-> SimpleObject -- ^ Object definition |
|
257 |
-> (SimpleConstructor -> Q Clause) -- ^ Constructor save fn |
|
258 |
-> Q (Dec, Dec) |
|
259 |
genSaveSimpleObj tname sname opdefs fn = do |
|
260 |
let sigt = AppT (AppT ArrowT (ConT tname)) (ConT ''JSON.JSValue) |
|
261 |
fname = mkName sname |
|
262 |
cclauses <- mapM fn opdefs |
|
263 |
return $ (SigD fname sigt, FunD fname cclauses) |
|
264 |
|
|
239 | 265 |
-- * Template code for simple raw type-equivalent ADTs |
240 | 266 |
|
241 | 267 |
-- | Generates a data type declaration. |
... | ... | |
573 | 599 |
-- |
574 | 600 |
genLuxiOp :: String -> SimpleObject -> Q [Dec] |
575 | 601 |
genLuxiOp name cons = do |
576 |
decl_d <- mapM (\(cname, fields) -> do |
|
577 |
fields' <- mapM (\(_, qt) -> |
|
578 |
qt >>= \t -> return (NotStrict, t)) |
|
579 |
fields |
|
580 |
return $ NormalC (mkName cname) fields') |
|
581 |
cons |
|
582 |
let declD = DataD [] (mkName name) [] decl_d [''Show, ''Read, ''Eq] |
|
583 |
(savesig, savefn) <- genSaveLuxiOp cons |
|
602 |
let tname = mkName name |
|
603 |
declD <- buildSimpleCons tname cons |
|
604 |
(savesig, savefn) <- genSaveSimpleObj tname "opToArgs" |
|
605 |
cons saveLuxiConstructor |
|
584 | 606 |
req_defs <- declareSADT "LuxiReq" . |
585 | 607 |
map (\(str, _) -> ("Req" ++ str, mkName ("luxiReq" ++ str))) $ |
586 | 608 |
cons |
... | ... | |
603 | 625 |
else [| JSON.showJSON $(listE flist) |] |
604 | 626 |
clause [pat] (normalB finval) [] |
605 | 627 |
|
606 |
-- | Generates the main save LuxiOp function. |
|
607 |
genSaveLuxiOp :: SimpleObject-> Q (Dec, Dec) |
|
608 |
genSaveLuxiOp opdefs = do |
|
609 |
sigt <- [t| $(conT (mkName "LuxiOp")) -> JSON.JSValue |] |
|
610 |
let fname = mkName "opToArgs" |
|
611 |
cclauses <- mapM saveLuxiConstructor opdefs |
|
612 |
return $ (SigD fname sigt, FunD fname cclauses) |
|
613 |
|
|
614 | 628 |
-- * "Objects" functionality |
615 | 629 |
|
616 | 630 |
-- | Extract the field's declaration from a Field structure. |
Also available in: Unified diff