Haskell PostgreSQL Simple FromField

1k Views Asked by At

I'm having trouble with defining FromField instance for my custom enum data type:

data Role = Staff | Student deriving (Eq, Ord, Show)

To represent Role in my database, I will use ints 0 and 1 (more roles could be added later) most likely smallint.

Review is used in my other data type that represents a row in my db table:

data ReviewAssignment = ReviewAssignment
  { aID :: ID
  , reviewID :: ID
  , reviewerID :: ID
  , revieweeID :: ID
  , reviewerRole :: Role -- <-- right there
  , reviewFinished :: Bool
  , reviewPoints :: Float
  } deriving (Show, Eq)

This is my FromRow instance for ReviewAssignment:

instance FromRow ReviewAssignment where
  fromRow = ReviewAssignment <$> field <*> field <*> field <*> field <*> field <*> field <*> field

Now I'm just missing the following which I don't understand how to implement :

instance FromField Role where
  fromField = undefined
2

There are 2 best solutions below

0
On BEST ANSWER

Probably to late but something like this should work (hopefully):

instance FromField Role where
  fromField f mdata =
    return role
    where role = case mdata of
      Just 0 -> Staff   
      _      -> Student
1
On

fromField should take an integer (the smallint from your database) and return a Role value. I sugegst you implement it using pattern matching. You can read more about fromField in the documentation. You can also take inspiration from predefined fromField implementations.