Revision 92ad1f44

b/htools/Ganeti/THH.hs
513 513
          -> [(String, [Field])]   -- ^ Constructor name and parameters
514 514
          -> Q [Dec]
515 515
genOpCode name cons = do
516
  let tname = mkName name
516 517
  decl_d <- mapM (\(cname, fields) -> do
517 518
                    -- we only need the type of the field, without Q
518 519
                    fields' <- mapM actualFieldType fields
519 520
                    let fields'' = zip (repeat NotStrict) fields'
520 521
                    return $ NormalC (mkName cname) fields'')
521 522
            cons
522
  let declD = DataD [] (mkName name) [] decl_d [''Show, ''Read, ''Eq]
523
  let declD = DataD [] tname [] decl_d [''Show, ''Read, ''Eq]
523 524

  
524
  (savesig, savefn) <- genSaveOpCode cons
525
  (savesig, savefn) <- genSaveOpCode tname "saveOpCode" cons
526
                         (uncurry saveConstructor)
525 527
  (loadsig, loadfn) <- genLoadOpCode cons
526 528
  return [declD, loadsig, loadfn, savesig, savefn]
527 529

  
......
551 553
--
552 554
-- This builds a per-constructor match clause that contains the
553 555
-- respective constructor-serialisation code.
554
genSaveOpCode :: [(String, [Field])] -> Q (Dec, Dec)
555
genSaveOpCode opdefs = do
556
  cclauses <- mapM (uncurry saveConstructor) opdefs
557
  let fname = mkName "saveOpCode"
558
  sigt <- [t| $(conT (mkName "OpCode")) -> JSON.JSValue |]
556
genSaveOpCode :: Name                            -- ^ Object ype
557
              -> String                          -- ^ Function name
558
              -> [(String, [Field])]             -- ^ Object definition
559
              -> ((String, [Field]) -> Q Clause) -- ^ Constructor save fn
560
              -> Q (Dec, Dec)
561
genSaveOpCode tname sname opdefs fn = do
562
  cclauses <- mapM fn opdefs
563
  let fname = mkName sname
564
      sigt = AppT  (AppT ArrowT (ConT tname)) (ConT ''JSON.JSValue)
559 565
  return $ (SigD fname sigt, FunD fname cclauses)
560 566

  
561 567
-- | Generates load code for a single constructor of the opcode data type.

Also available in: Unified diff