Browse Source

Resolved merge conflict in cabal file

Getty Ritter 9 years ago
parent
commit
de01a7e21c

+ 13 - 0
Codec/ActivityStream/Internal.hs

@@ -1,7 +1,20 @@
+{-# LANGUAGE ViewPatterns #-}
+
 module Codec.ActivityStream.Internal (commonOpts, commonOptsCC) where
 
+import Control.Monad (mzero)
+import Data.Aeson
 import Data.Aeson.TH
 import Data.Char
+import Data.Text (pack, unpack)
+import Network.URI (URI, parseURI)
+
+instance FromJSON URI where
+  parseJSON (String ((parseURI . unpack) -> Just u)) = return u
+  parseJSON _ = mzero
+
+instance ToJSON URI where
+  toJSON = String . pack . show
 
 toCamelCaseUpper :: String -> String
 toCamelCaseUpper = toCamelCase True

+ 28 - 20
Codec/ActivityStream/Representation.hs

@@ -20,6 +20,7 @@ import           Data.DateTime
 import qualified Data.HashMap.Strict as HM
 import           Data.Maybe (catMaybes)
 import           Data.Text (Text)
+import           Network.URI
 
 import Codec.ActivityStream.Internal
 
@@ -47,19 +48,19 @@ makeLenses ''MediaLink
 deriveJSON (commonOpts "_ml") ''MediaLink
 
 data Object objType = Object
-  { _oAttachments          :: Maybe [Object objType]
+  { _oAttachments          :: [Object objType]
   , _oAuthor               :: Maybe (Object objType)
   , _oContent              :: Maybe Text
   , _oDisplayName          :: Maybe Text
-  , _oDownstreamDuplicates :: Maybe [Text]
-  , _oId                   :: Maybe Text
+  , _oDownstreamDuplicates :: [URI]
+  , _oId                   :: Maybe URI
   , _oImage                :: Maybe MediaLink
   , _oObjectType           :: Maybe objType
   , _oPublished            :: Maybe DateTime
   , _oSummary              :: Maybe Text
   , _oUpdated              :: Maybe DateTime
-  , _oUpstreamDuplicates   :: Maybe [Text]
-  , _oURL                  :: Maybe Text
+  , _oUpstreamDuplicates   :: [URI]
+  , _oURL                  :: Maybe URI
   , _oRest                 :: [(Text, Value)]
   } deriving (Eq, Show)
 
@@ -84,58 +85,65 @@ objectFields =
 
 instance FromJSON objType => FromJSON (Object objType) where
   parseJSON (Ae.Object o) =
-    Object <$> o .:? "attachments"
+    Object <$> fmap go (o .:? "attachments")
            <*> o .:? "author"
            <*> o .:? "content"
            <*> o .:? "displayName"
-           <*> o .:? "downstreamDuplicates"
+           <*> fmap go (o .:? "downstreamDuplicates")
            <*> o .:? "id"
            <*> o .:? "image"
            <*> o .:? "objectType"
            <*> o .:? "published"
            <*> o .:? "summary"
            <*> o .:? "updated"
-           <*> o .:? "upstreamDuplicates"
+           <*> fmap go (o .:? "upstreamDuplicates")
            <*> o .:? "url"
            <*> pure rest
     where rest = HM.toList (foldr HM.delete o objectFields)
+          go :: Maybe [a] -> [a]
+          go Nothing   = []
+          go (Just xs) = xs
 
 instance ToJSON objType => ToJSON (Object objType) where
   toJSON obj = object (attrs ++ _oRest obj)
     where attrs = catMaybes
-            [ "attachments"          .=? _oAttachments obj
+            [ "attachments"          .=! _oAttachments obj
             , "author"               .=? _oAuthor obj
             , "content"              .=? _oContent obj
             , "displayName"          .=? _oDisplayName obj
-            , "downstreamDuplicates" .=? _oDownstreamDuplicates obj
+            , "downstreamDuplicates" .=! _oDownstreamDuplicates obj
             , "id"                   .=? _oId obj
             , "image"                .=? _oImage obj
             , "objectType"           .=? _oObjectType obj
             , "published"            .=? _oPublished obj
             , "summary"              .=? _oSummary obj
             , "updated"              .=? _oUpdated obj
-            , "upstreamDuplicates"   .=? _oUpstreamDuplicates obj
+            , "upstreamDuplicates"   .=! _oUpstreamDuplicates obj
             , "url"                  .=? _oURL obj
             ]
           (.=?) :: ToJSON a => Text -> Maybe a -> Maybe (Text, Value)
           x .=? Just y  = Just (x, toJSON y)
           _ .=? Nothing = Nothing
           infix 1 .=?
+          (.=!) :: ToJSON a => Text -> [a] -> Maybe (Text, Value)
+          _ .=! [] = Nothing
+          x .=! ys = Just (x, toJSON ys)
+          infix 1 .=!
 
 emptyObject :: Object objType
 emptyObject = Object
-  { _oAttachments          = Nothing
+  { _oAttachments          = []
   , _oAuthor               = Nothing
   , _oContent              = Nothing
   , _oDisplayName          = Nothing
-  , _oDownstreamDuplicates = Nothing
+  , _oDownstreamDuplicates = []
   , _oId                   = Nothing
   , _oImage                = Nothing
   , _oObjectType           = Nothing
   , _oPublished            = Nothing
   , _oSummary              = Nothing
   , _oUpdated              = Nothing
-  , _oUpstreamDuplicates   = Nothing
+  , _oUpstreamDuplicates   = []
   , _oURL                  = Nothing
   , _oRest                 = []
   }
@@ -145,13 +153,13 @@ data Activity verb objType = Activity
   , _acContent   :: Maybe Text
   , _acGenerator :: Maybe (Object objType)
   , _acIcon      :: Maybe MediaLink
-  , _acId        :: Maybe Text
+  , _acId        :: Maybe URI
   , _acPublished :: DateTime
   , _acProvider  :: Object objType
   , _acTarget    :: Maybe (Object objType)
   , _acTitle     :: Maybe Text
   , _acUpdated   :: Maybe DateTime
-  , _acURL       :: Maybe Text
+  , _acURL       :: Maybe URI
   , _acVerb      :: Maybe verb
   } deriving (Eq, Show)
 
@@ -177,16 +185,16 @@ makeMinimalActivity actor published provider = Activity
 
 data Collection objType = Collection
   { _cTotalItems :: Maybe Int
-  , _cItems      :: Maybe [Object objType]
-  , _cURL        :: Maybe Text
+  , _cItems      :: [Object objType]
+  , _cURL        :: Maybe URI
   } deriving (Eq, Show)
 
 makeLenses ''Collection
 deriveJSON (commonOpts "_c") ''Collection
 
-makeCollection :: Maybe [Object objType] -> Maybe Text -> Collection objType
+makeCollection :: [Object objType] -> Maybe URI -> Collection objType
 makeCollection objs url = Collection
-  { _cTotalItems = fmap length objs
+  { _cTotalItems = Just (length objs)
   , _cItems      = objs
   , _cURL        = url
   }

+ 8 - 1
activitystreams-aeson.cabal

@@ -21,5 +21,12 @@ library
                        Codec.ActivityStream.Schema,
                        Codec.ActivityStream
   other-modules:       Codec.ActivityStream.Internal
-  build-depends:       base >=4.7 && <4.8, aeson, text, url, lens, datetime, unordered-containers
+  build-depends:       base >=4.7 && <4.8,
+                       aeson,
+                       text,
+                       url,
+                       lens,
+                       datetime,
+                       unordered-containers,
+                       network-uri
   default-language:    Haskell2010