snaplet-rest

REST resources for the Snap web framework http://github.com/zimothy/snaplet-rest

Latest on Hackage:0.1.0

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.

MIT licensed by Timothy Jones
Maintained by Timothy Jones

REST resources for the Snap framework.

As an example, let's translate the following datatype into a resource.

data User = User Username String Int

type Username = CI String

We need a type to represent changes to the resource. This partial type indicates what properties to change: either the name, the age, or both.

data UserPart = UserPart (Maybe String) (Maybe Int)

This type also acts as a search mechanism: we can search by names, ages, or both. We can use either a username or a UserPart search to find users, and define a function to convert URL query string parameters to this search.

type UserId = Either Username UserPart

userIdFromParams :: Params -> Maybe UserId

Now we have the pieces required to define our CRUD behaviour.

createUser :: User -> AppHandler ()

readUser :: UserId -> AppHandler [User]

updateUser :: UserId -> UserPart -> AppHandler Bool

deleteUser :: UserId -> AppHandler Bool

If we've implemented Aeson instances, we can add JSON as a media format without having to define these manually. Once the behaviour is attached to the resource, it can be served in the handler.

serveUser :: AppHandler ()
serveUser = serveResource $ resource
    & addMedia jsonInstances
    & setCreate createUser
    & setRead readUser
    & setUpdate updateUser
    & setDelete deleteUser
    & setFromParams userIdFromParams
comments powered byDisqus