make lots of fields optional & get rid of vector

This commit is contained in:
Rhiannon Morris 2020-07-12 05:40:14 +02:00
parent cc485f798d
commit de160967e8
3 changed files with 62 additions and 43 deletions

View file

@ -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