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
data Updates = Updates {
items :: [Int]
, profiles :: [UserName]
} deriving (Show, Eq, Generic)
instance ToJSON Updates
instance FromJSON Updates
newtype MaxItem = MaxItem Int
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype TopStories = TopStories [Int]
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype NewStories = NewStories [Int]
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype BestStories = BestStories [Int]
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype AskStories = AskStories [Int]
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype ShowStories = ShowStories [Int]
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype JobStories = JobStories [Int]
deriving (Show, Eq, ToJSON, FromJSON, Generic)
data User = User {
userId :: UserId
, userDelay :: Maybe Delay
, userCreated :: Created
, userKarma :: Karma
, userAbout :: Maybe About
, userSubmitted :: Maybe Submitted
} deriving (Show, Eq, Generic)
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)
newtype UserId = UserId T.Text
deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData, Generic)
newtype Delay = Delay Int
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype Created = Created Int
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype About = About T.Text
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype Submitted = Submitted [Int]
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype ItemId = ItemId Int
deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData, Generic)
newtype Deleted = Deleted Int
deriving (Show, Eq, ToJSON, FromJSON, Generic)
data ItemType = Job | Story | Comment | Poll | PollOpt
deriving (Show, Eq, Generic)
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)
newtype ItemText = ItemText T.Text
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype Dead = Dead Bool
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype Parent = Parent Int
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype Time = Time Integer
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype Kids = Kids [Int]
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype URL = URL T.Text
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype Score = Score Int
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype Title = Title T.Text
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype Parts = Parts [Int]
deriving (Show, Eq, ToJSON, FromJSON, Generic)
newtype Descendants = Descendants Int
deriving (Show, Eq, ToJSON, FromJSON, Generic)
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 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)