|
@@ -1,5 +1,6 @@
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
|
|
+
|
|
|
|
|
|
Module : Codec.ActivityStream.Dynamic
|
|
|
Description : A (more dynamic) interface to Activity Streams
|
|
@@ -9,22 +10,22 @@ Maintainer : gdritter@galois.com
|
|
|
This is an interface to ActivityStreams that simply wraps an underlying
|
|
|
@aeson@ Object, and exposes a set of (convenient) lenses to access the
|
|
|
values inside. If an @aeson@ object is wrapped in the respective wrapper,
|
|
|
-it will contain the obligatory values for that type (e.g. an @Activity@
|
|
|
+it will contain the obligatory values for that type (e.g. an 'Activity'
|
|
|
is guaranteed to have a @published@ date.)
|
|
|
+
|
|
|
+Most of the inline documentation is drawn directly from the
|
|
|
+<http://activitystrea.ms/specs/json/1.0/ JSON Activity Streams 1.0>
|
|
|
+specification, with minor modifications
|
|
|
+to refer to the corresponding data types in this module and to clarify
|
|
|
+certain aspects.
|
|
|
-}
|
|
|
|
|
|
module Codec.ActivityStream.Dynamic
|
|
|
( Lens'
|
|
|
-
|
|
|
- , MediaLink
|
|
|
- , mlDuration
|
|
|
- , mlHeight
|
|
|
- , mlWidth
|
|
|
- , mlURL
|
|
|
- , mlRest
|
|
|
- , makeMediaLink
|
|
|
|
|
|
, Object
|
|
|
+ , emptyObject
|
|
|
+
|
|
|
, oAttachments
|
|
|
, oAuthor
|
|
|
, oContent
|
|
@@ -39,9 +40,11 @@ module Codec.ActivityStream.Dynamic
|
|
|
, oUpstreamDuplicates
|
|
|
, oURL
|
|
|
, oRest
|
|
|
- , emptyObject
|
|
|
|
|
|
, Activity
|
|
|
+ , makeActivity
|
|
|
+ , asObject
|
|
|
+
|
|
|
, acActor
|
|
|
, acContent
|
|
|
, acGenerator
|
|
@@ -56,15 +59,23 @@ module Codec.ActivityStream.Dynamic
|
|
|
, acURL
|
|
|
, acVerb
|
|
|
, acRest
|
|
|
- , makeActivity
|
|
|
- , asObject
|
|
|
+
|
|
|
+ , MediaLink
|
|
|
+ , makeMediaLink
|
|
|
+
|
|
|
+ , mlDuration
|
|
|
+ , mlHeight
|
|
|
+ , mlWidth
|
|
|
+ , mlURL
|
|
|
+ , mlRest
|
|
|
|
|
|
, Collection
|
|
|
+ , makeCollection
|
|
|
+
|
|
|
, cTotalItems
|
|
|
, cItems
|
|
|
, cURL
|
|
|
, cRest
|
|
|
- , makeCollection
|
|
|
) where
|
|
|
|
|
|
import Data.Aeson ( FromJSON(..)
|
|
@@ -77,91 +88,177 @@ import Data.DateTime (DateTime)
|
|
|
import qualified Data.HashMap.Strict as HM
|
|
|
import Data.Text (Text)
|
|
|
|
|
|
-import Codec.ActivityStream.LensInternal ( Lens'
|
|
|
- , makeLens
|
|
|
- , makeAesonLens
|
|
|
- , makeAesonLensMb
|
|
|
- )
|
|
|
+import Codec.ActivityStream.LensInternal
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
data MediaLink = MediaLink { fromMediaLink :: A.Object } deriving (Eq, Show)
|
|
|
|
|
|
instance FromJSON MediaLink where
|
|
|
- parseJSON (A.Object o) | HM.member "url" o = return (MediaLink o)
|
|
|
- | otherwise = fail "..."
|
|
|
- parseJSON _ = fail "..."
|
|
|
+ parseJSON (A.Object o)
|
|
|
+ | HM.member "url" o = return (MediaLink o)
|
|
|
+ | otherwise = fail "MediaLink object contains no \"url\" property"
|
|
|
+ parseJSON _ = fail "MediaLink not an object"
|
|
|
|
|
|
instance ToJSON MediaLink where
|
|
|
toJSON (MediaLink o) = A.Object o
|
|
|
|
|
|
+
|
|
|
mlRest :: Lens' MediaLink A.Object
|
|
|
mlRest = makeLens fromMediaLink (\ o' m -> m { fromMediaLink = o' })
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
mlDuration :: Lens' MediaLink (Maybe Int)
|
|
|
mlDuration = makeAesonLensMb "duration" mlRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
mlHeight :: Lens' MediaLink (Maybe Int)
|
|
|
mlHeight = makeAesonLensMb "height" mlRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
mlWidth :: Lens' MediaLink (Maybe Int)
|
|
|
mlWidth = makeAesonLensMb "width" mlRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
mlURL :: Lens' MediaLink Text
|
|
|
mlURL = makeAesonLens "url" mlRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
makeMediaLink :: Text -> MediaLink
|
|
|
makeMediaLink url = MediaLink (HM.insert "url" (toJSON url) HM.empty)
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
data Object = Object { fromObject :: A.Object } deriving (Eq, Show)
|
|
|
|
|
|
instance FromJSON Object where
|
|
|
parseJSON (A.Object o) = return (Object o)
|
|
|
- parseJSON _ = fail "..."
|
|
|
+ parseJSON _ = fail "Object not an object"
|
|
|
|
|
|
instance ToJSON Object where
|
|
|
toJSON (Object o) = A.Object o
|
|
|
|
|
|
+
|
|
|
oRest :: Lens' Object A.Object
|
|
|
oRest = makeLens fromObject (\ o' m -> m { fromObject = o' })
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oAttachments :: Lens' Object (Maybe [Object])
|
|
|
oAttachments = makeAesonLensMb "attachments" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oAuthor :: Lens' Object (Maybe Object)
|
|
|
oAuthor = makeAesonLensMb "author" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oContent :: Lens' Object (Maybe Text)
|
|
|
oContent = makeAesonLensMb "content" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oDisplayName :: Lens' Object (Maybe Text)
|
|
|
oDisplayName = makeAesonLensMb "displayName" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oDownstreamDuplicates :: Lens' Object (Maybe [Text])
|
|
|
oDownstreamDuplicates = makeAesonLensMb "downstreamDuplicates" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oId :: Lens' Object (Maybe Text)
|
|
|
oId = makeAesonLensMb "id" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oImage :: Lens' Object (Maybe MediaLink)
|
|
|
oImage = makeAesonLensMb "image" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oObjectType :: (FromJSON o, ToJSON o) => Lens' Object (Maybe o)
|
|
|
oObjectType = makeAesonLensMb "objectType" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
oPublished :: Lens' Object (Maybe DateTime)
|
|
|
oPublished = makeAesonLensMb "published" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oSummary :: Lens' Object (Maybe Text)
|
|
|
oSummary = makeAesonLensMb "summary" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
oUpdated :: Lens' Object (Maybe DateTime)
|
|
|
oUpdated = makeAesonLensMb "updated" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oUpstreamDuplicates :: Lens' Object (Maybe [Text])
|
|
|
oUpstreamDuplicates = makeAesonLensMb "upstreamDuplicates" oRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
oURL :: Lens' Object (Maybe Text)
|
|
|
oURL = makeAesonLensMb "url" oRest
|
|
|
|
|
@@ -169,7 +266,11 @@ oURL = makeAesonLensMb "url" oRest
|
|
|
emptyObject :: Object
|
|
|
emptyObject = Object HM.empty
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
data Activity = Activity { fromActivity :: A.Object } deriving (Eq, Show)
|
|
|
|
|
@@ -182,45 +283,101 @@ instance FromJSON Activity where
|
|
|
instance ToJSON Activity where
|
|
|
toJSON (Activity o) = A.Object o
|
|
|
|
|
|
+
|
|
|
acRest :: Lens' Activity A.Object
|
|
|
acRest = makeLens fromActivity (\ o' m -> m { fromActivity = o' })
|
|
|
|
|
|
+
|
|
|
+
|
|
|
acActor :: Lens' Activity Object
|
|
|
acActor = makeAesonLens "actor" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
acContent :: Lens' Activity (Maybe Text)
|
|
|
acContent = makeAesonLensMb "content" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
acGenerator :: Lens' Activity (Maybe Object)
|
|
|
acGenerator = makeAesonLens "generator" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
acIcon :: Lens' Activity (Maybe MediaLink)
|
|
|
acIcon = makeAesonLensMb "icon" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
acId :: Lens' Activity (Maybe Text)
|
|
|
acId = makeAesonLensMb "id" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
acObject :: Lens' Activity (Maybe Object)
|
|
|
acObject = makeAesonLensMb "object" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
acPublished :: Lens' Activity DateTime
|
|
|
acPublished = makeAesonLens "published" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
acProvider :: Lens' Activity (Maybe Object)
|
|
|
acProvider = makeAesonLensMb "provider" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
acTarget :: Lens' Activity (Maybe Object)
|
|
|
acTarget = makeAesonLensMb "target" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
acTitle :: Lens' Activity (Maybe Text)
|
|
|
acTitle = makeAesonLensMb "title" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
acUpdated :: Lens' Activity (Maybe DateTime)
|
|
|
acUpdated = makeAesonLensMb "updated" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
acURL :: Lens' Activity (Maybe Text)
|
|
|
acURL = makeAesonLensMb "url" acRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
acVerb :: (FromJSON v, ToJSON v) => Lens' Activity (Maybe v)
|
|
|
acVerb = makeAesonLensMb "verb" acRest
|
|
|
|
|
@@ -238,7 +395,13 @@ makeActivity actor published = Activity
|
|
|
asObject :: Activity -> Object
|
|
|
asObject act = Object (fromActivity act)
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
data Collection = Collection { fromCollection :: A.Object } deriving (Eq, Show)
|
|
|
|
|
@@ -249,15 +412,28 @@ instance FromJSON Collection where
|
|
|
instance ToJSON Collection where
|
|
|
toJSON (Collection o) = A.Object o
|
|
|
|
|
|
+
|
|
|
cRest :: Lens' Collection A.Object
|
|
|
cRest = makeLens fromCollection (\ o' m -> m { fromCollection = o' })
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
cTotalItems :: Lens' Collection (Maybe Int)
|
|
|
cTotalItems = makeAesonLensMb "totalItems" cRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
cItems :: Lens' Collection (Maybe [Object])
|
|
|
cItems = makeAesonLensMb "items" cRest
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
cURL :: Lens' Collection (Maybe Text)
|
|
|
cURL = makeAesonLensMb "url" cRest
|
|
|
|