aboutsummaryrefslogtreecommitdiff
path: root/src/Text
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text')
-rw-r--r--src/Text/Pandoc/Shared.hs15
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