diff options
-rw-r--r-- | src/Text/Pandoc/Shared.hs | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/Text/Pandoc/Shared.hs b/src/Text/Pandoc/Shared.hs index 9ee6b0f15..c9b5842b3 100644 --- a/src/Text/Pandoc/Shared.hs +++ b/src/Text/Pandoc/Shared.hs @@ -64,6 +64,7 @@ module Text.Pandoc.Shared ( addMetaField, makeMeta, metaToJSON, + getField, setField, defField, -- * TagSoup HTML handling @@ -113,7 +114,7 @@ import Network.Browser (browse, setAllowRedirects, setOutHandler, request) import qualified Data.Traversable as Traversable import qualified Data.HashMap.Strict as H import qualified Data.Text as T -import Data.Aeson (ToJSON (..), Value(Object), Result(..), fromJSON) +import Data.Aeson (FromJSON(..), fromJSON, ToJSON (..), Value(Object), Result(..)) #ifdef EMBED_DATA_FILES import Text.Pandoc.Data (dataFiles) @@ -554,6 +555,18 @@ metaValueToJSON _ _ (MetaString s) = return $ toJSON s metaValueToJSON blockWriter _ (MetaBlocks bs) = liftM toJSON $ blockWriter bs metaValueToJSON _ inlineWriter (MetaInlines bs) = liftM toJSON $ inlineWriter bs +-- | Retrieve a field value from a JSON object. +getField :: FromJSON a + => String + -> Value + -> Maybe a +getField field (Object hashmap) = do + result <- H.lookup (T.pack field) hashmap + case fromJSON result of + Success x -> return x + _ -> fail "Could not convert from JSON" +getField field _ = fail "Not a JSON object" + setField :: ToJSON a => String -> a |