enumSerializeImpl ename labels
 = do sayln' $ enumSerializeProto ename ++ " {"
      sayln' $ "  int ret = 0;"
      sayln' $ "  "
      sayln' $ "  switch (in) {"
      flip mapM_ labels $ \EnumLabel{ label_name = lname, label_val = lval }
        -> do sayln' $ "    case " ++ lname ++ ":"
              sayln' $ "      ret = " ++ serialize (FInt IKSigned IS32) ++ "(out, out_len, pos, " ++ show lval ++ ");"
              sayln' $ "      break;"
      sayln' $ "    default: ret = -1;"
      sayln' $ "  }"
      sayln' $ "  "
      sayln' $ "  return ret;"
      sayln' $ "}"
enumSerializeImpl ename labels
 = do sayln' $ enumSerializeProto ename ++ " {"
      sayln' $ "  int ret = 0;"
      sayln' $ "  "
      sayln' $ "  switch (in) {"
      flip mapM_ labels $ \EnumLabel{ label_name = lname, label_val = lval }
        -> do sayln' $ "    case " ++ lname ++ ":"
              sayln' $ "      ret = " ++ serialize (FInt IKSigned IS32) ++ "(out, out_len, pos, " ++ show lval ++ ");"
              sayln' $ "      break;"
      sayln' $ "    default: ret = -1;"
      sayln' $ "  }"
      sayln' $ "  "
      sayln' $ "  return ret;"
      sayln' $ "}"
enumSerializeImpl ename labels
 = do sayln' $ enumSerializeProto ename ++ " {"
      sayln' $ "  int ret = 0;"
      sayln' $ "  "
      sayln' $ "  switch (in) {"
      flip mapM_ labels $ \EnumLabel{ label_name = lname, label_val = lval }
        -> do sayln' $ "    case " ++ lname ++ ":"
              sayln' $ "      ret = " ++ serialize (FInt IKSigned IS32) ++ "(out, out_len, pos, " ++ show lval ++ ");"
              sayln' $ "      break;"
      sayln' $ "    default: ret = -1;"
      sayln' $ "  }"
      sayln' $ "  "
      sayln' $ "  return ret;"
      sayln' $ "}"