@@ -2,20 +2,23 @@
22module Foreign.JavaScript.Utils
33 ( bsFromMutableArrayBuffer
44 , bsToArrayBuffer
5− , jsonParse
6− , safeJsonParse
5+ , jsonDecode
6+ , js_jsonParse
77 ) where
88
9−import Control.Exception
9+import Control.Exception (SomeException)
1010import Control.Lens
11+import Data.Aeson
1112import Data.ByteString (ByteString)
1213import qualified Data.ByteString as BS
1314import Foreign.JavaScript.Internal.Utils (js_dataView)
1415import qualified GHCJS.Buffer as JS
1516import GHCJS.DOM.Types (ArrayBuffer (..))
16−import qualified Language.Javascript.JSaddle as JS (catch, jsg, js1)
17+import GHCJS.Marshal ()
18+import Language.Javascript.JSaddle (fromJSVal, catch, jsg, js1)
1719import qualified JavaScript.TypedArray.ArrayBuffer as JS
1820import Language.Javascript.JSaddle.Types (JSString, JSM, JSVal, MonadJSM, ghcjsPure, jsval, liftJSM)
21+import System.IO.Unsafe
1922
2023{-# INLINABLE bsFromMutableArrayBuffer #-}
2124bsFromMutableArrayBuffer :: MonadJSM m => JS.MutableArrayBuffer -> m ByteString
@@ -32,8 +35,12 @@ bsToArrayBuffer bs = liftJSM $ do
3235 ref <- ghcjsPure (JS.getArrayBuffer b) >>= ghcjsPure . jsval
3336 js_dataView off len ref
3437
35−safeJsonParse :: JSString -> JSM (Maybe JSVal)
36−safeJsonParse a = (Just <$> jsonParse a) `JS.catch` \(_ :: SomeException) -> return Nothing
38+jsonDecode :: FromJSON a => JSString -> Maybe a
39+jsonDecode t = do
40+ result <- unsafePerformIO $ (fromJSVal =<< js_jsonParse t) `catch` (\(_ :: SomeException) -> pure Nothing)
41+ case fromJSON result of
42+ Success a -> Just a
43+ Error _ -> Nothing
3744
38−jsonParse :: JSString -> JSM JSVal
39−jsonParse a = JS.jsg "JSON" ^. JS.js1 "parse" a
45+js_jsonParse :: JSString -> JSM JSVal
46+js_jsonParse a = jsg "JSON" ^. js1 "parse" a