module Web.HackerNews.Types where
import Data.Aeson
import Data.Aeson.Types
import Data.Char
import qualified Data.Text as T
import GHC.Generics
import Servant.API
import Test.QuickCheck
import Test.QuickCheck.Instances ()
data Updates = Updates {
items :: [ItemId]
, profiles :: [UserName]
} deriving (Show, Eq, Generic)
instance ToJSON Updates
instance FromJSON Updates
instance Arbitrary Updates where
arbitrary = Updates <$> arbitrary <*> arbitrary
newtype MaxItem = MaxItem ItemId
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype TopStories = TopStories [ItemId]
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype NewStories = NewStories [ItemId]
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype BestStories = BestStories [ItemId]
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype AskStories = AskStories [ItemId]
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype ShowStories = ShowStories [ItemId]
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype JobStories = JobStories [ItemId]
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
data User = User {
userId :: UserId
, userDelay :: Maybe Delay
, userCreated :: Created
, userKarma :: Karma
, userAbout :: Maybe About
, userSubmitted :: Maybe Submitted
} deriving (Show, Eq, Generic)
instance Arbitrary User where
arbitrary =
User <$> arbitrary <*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary <*> arbitrary
instance ToJSON User where
toJSON = genericToJSON defaultOptions {
fieldLabelModifier = map toLower . drop 4
}
instance FromJSON User where
parseJSON = genericParseJSON defaultOptions {
fieldLabelModifier = map toLower . drop 4
}
newtype Karma = Karma Int
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype UserId = UserId T.Text
deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData, Generic, Arbitrary)
newtype Delay = Delay Int
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype Created = Created Int
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype About = About T.Text
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype Submitted = Submitted [ItemId]
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype ItemId = ItemId Int
deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData, Generic, Arbitrary)
newtype Deleted = Deleted Bool
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
data ItemType = Job | Story | Comment | Poll | PollOpt
deriving (Show, Eq, Generic, Enum)
instance Arbitrary ItemType where
arbitrary = elements [ Job .. ]
instance ToJSON ItemType where
toJSON = genericToJSON
defaultOptions { constructorTagModifier = map toLower }
instance FromJSON ItemType where
parseJSON = genericParseJSON
defaultOptions { constructorTagModifier = map toLower }
newtype UserName = UserName T.Text
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype ItemText = ItemText T.Text
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype Dead = Dead Bool
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype Parent = Parent ItemId
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype Time = Time Integer
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype Kids = Kids [ItemId]
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype URL = URL T.Text
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype Score = Score Int
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype Title = Title T.Text
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype Parts = Parts [ItemId]
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
newtype Descendants = Descendants Int
deriving (Show, Eq, ToJSON, FromJSON, Generic, Arbitrary)
data Item = Item {
itemId :: Maybe ItemId
, itemDeleted :: Maybe Deleted
, itemType :: ItemType
, itemBy :: Maybe UserName
, itemTime :: Maybe Time
, itemText :: Maybe ItemText
, itemDead :: Maybe Dead
, itemParent :: Maybe Parent
, itemKids :: Maybe Kids
, itemURL :: Maybe URL
, itemScore :: Maybe Score
, itemTitle :: Maybe Title
, itemParts :: Maybe Parts
, itemDescendants :: Maybe Descendants
} deriving (Show, Eq, Generic)
instance Arbitrary Item where
arbitrary = Item <$> arbitrary <*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary
instance ToJSON Item where
toJSON = genericToJSON
defaultOptions { fieldLabelModifier = map toLower . drop 4 }
instance FromJSON Item where
parseJSON = genericParseJSON
defaultOptions { fieldLabelModifier = map toLower . drop 4 }
data HackerNewsError
= NotFound
| FailureResponseError Int T.Text T.Text
| HNConnectionError T.Text
| DecodeFailureError T.Text T.Text
| InvalidContentTypeHeaderError T.Text T.Text
| UnsupportedContentTypeError T.Text
deriving (Show, Eq)