make lots of fields optional & get rid of vector
This commit is contained in:
parent
cc485f798d
commit
de160967e8
3 changed files with 62 additions and 43 deletions
|
@ -2,16 +2,14 @@
|
|||
module Info
|
||||
(Info (..), Image (..), Link (..),
|
||||
-- ** Reexports
|
||||
Day (..), Text, Vector)
|
||||
Day (..), Text)
|
||||
where
|
||||
|
||||
import Data.YAML (FromYAML (..), (.:))
|
||||
import Data.YAML (FromYAML (..), (.:), (.:?), (.!=))
|
||||
import qualified Data.YAML as YAML
|
||||
import Data.Time.Calendar (Day (..))
|
||||
import Data.Text (Text)
|
||||
import qualified Data.Text as Text
|
||||
import Data.Vector (Vector)
|
||||
import qualified Data.Vector as Vector
|
||||
import qualified Data.Map.Strict as Map
|
||||
import Control.Applicative
|
||||
import Text.Read (readMaybe)
|
||||
|
@ -20,12 +18,12 @@ import Text.Read (readMaybe)
|
|||
data Info =
|
||||
Info {
|
||||
date :: !Day,
|
||||
title :: !Text,
|
||||
tags :: !(Vector Text),
|
||||
description :: !Text,
|
||||
images :: !(Vector Image),
|
||||
title :: !(Maybe Text),
|
||||
tags :: ![Text],
|
||||
description :: !(Maybe Text),
|
||||
images :: ![Image],
|
||||
thumb :: !Text,
|
||||
links :: !(Vector Link)
|
||||
links :: ![Link]
|
||||
}
|
||||
deriving (Eq, Show)
|
||||
|
||||
|
@ -48,13 +46,13 @@ data Link =
|
|||
|
||||
instance FromYAML Info where
|
||||
parseYAML = YAML.withMap "info" \m ->
|
||||
Info <$> m .: "date"
|
||||
<*> m .: "title"
|
||||
<*> m .: "tags"
|
||||
<*> m .: "description"
|
||||
<*> m .: "images"
|
||||
<*> m .: "thumb"
|
||||
<*> m .: "links"
|
||||
Info <$> m .: "date"
|
||||
<*> m .:? "title"
|
||||
<*> m .:? "tags" .!= []
|
||||
<*> m .:? "description"
|
||||
<*> m .: "images"
|
||||
<*> m .: "thumb"
|
||||
<*> m .:? "links" .!= []
|
||||
|
||||
instance FromYAML Image where
|
||||
parseYAML = labelledOptNsfw Image "path" "path"
|
||||
|
@ -95,7 +93,8 @@ parseOptNsfw :: FromYAML a
|
|||
-> YAML.Node YAML.Pos -> YAML.Parser (OptNsfw a)
|
||||
parseOptNsfw name field y = yes y <|> no y where
|
||||
yes = YAML.withMap (name <> " & nsfw") \m ->
|
||||
WithNsfw <$> m .: field <*> m .: "nsfw"
|
||||
WithNsfw <$> m .: field
|
||||
<*> m .:? "nsfw" .!= False
|
||||
no = fmap NoNsfw . parseYAML
|
||||
|
||||
|
||||
|
@ -104,6 +103,3 @@ instance FromYAML Day where
|
|||
case readMaybe $ Text.unpack str of
|
||||
Just d -> pure d
|
||||
Nothing -> fail $ "couldn't parse date " ++ show str
|
||||
|
||||
instance FromYAML a => FromYAML (Vector a) where
|
||||
parseYAML = YAML.withSeq "seq" $ fmap Vector.fromList . traverse parseYAML
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue