monomer/examples/books/BookTypes.hs
2021-09-24 15:23:32 -03:00

71 lines
1.5 KiB
Haskell

{-|
Module : BookTypes
Copyright : (c) 2018 Francisco Vallarino
License : BSD-3-Clause (see the LICENSE file)
Maintainer : fjvallarino@gmail.com
Stability : experimental
Portability : non-portable
Types for the 'Books' example.
-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
module BookTypes where
import Control.Lens.TH
import Data.Aeson
import Data.Default
import Data.Maybe
import Data.Text (Text)
import Monomer
data Book = Book {
_bkTitle :: Text,
_bkAuthors :: [Text],
_bkYear :: Maybe Int,
_bkCover :: Maybe Int
} deriving (Eq, Show)
instance FromJSON Book where
parseJSON = withObject "Book" $ \b -> Book
<$> b .: "title"
<*> b .:? "author_name" .!= []
<*> b .:? "first_publish_year"
<*> b .:? "cover_i"
data BookResp = BookResp {
_brDocs :: [Book],
_brFound :: Int
} deriving (Eq, Show)
instance FromJSON BookResp where
parseJSON = withObject "BookResp" $ \b -> BookResp
<$> b .: "docs"
<*> b .: "numFound"
data BooksModel = BooksModel {
_bkmQuery :: Text,
_bmkSearching :: Bool,
_bkmErrorMsg :: Maybe Text,
_bkmBooks :: [Book],
_bmkSelected :: Maybe Book
} deriving (Eq, Show)
data BooksEvt
= BooksInit
| BooksSearch
| BooksSearchResult BookResp
| BooksSearchError Text
| BooksShowDetails Book
| BooksCloseDetails
| BooksCloseError
deriving (Eq, Show)
makeLensesWith abbreviatedFields 'Book
makeLensesWith abbreviatedFields 'BookResp
makeLensesWith abbreviatedFields 'BooksModel