@@ -43,6 +43,7 @@ module Language.Javascript.JSC.Value (
4343 , valToStr
4444 , valToObject
4545 , valToText
46+ , valToJSON
4647
4748 -- * Make JavaScript values from Haskell ones
4849 , val
@@ -65,10 +66,10 @@ import Language.Javascript.JSC.Exception (rethrow)
6566import Control.Monad.Trans.Reader (ask)
6667import Control.Monad.IO.Class (MonadIO, MonadIO(..))
6768import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
68− (JSType(..), jsvaluegettype, jsvaluemakestring, jsvaluemakenumber,
69− jsvaluemakeboolean, jsvaluemakeundefined, jsvaluemakenull,
70− jsvaluetoobject, jsvaluetostringcopy, jsvaluetonumber,
71− jsvaluetoboolean)
69+ (jsvaluecreatejsonstring, JSType(..), jsvaluegettype,
70+ jsvaluemakestring, jsvaluemakenumber, jsvaluemakeboolean,
71+ jsvaluemakeundefined, jsvaluemakenull, jsvaluetoobject,
72+ jsvaluetostringcopy, jsvaluetonumber, jsvaluetoboolean)
7273import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSStringRef
7374 (jsstringcreatewithcharacters, jsstringgetcharactersptr,
7475 jsstringgetlength)
@@ -83,6 +84,7 @@ import Language.Javascript.JSC.Classes
8384 MakeArgRefs(..))
8485import Language.Javascript.JSC.String (strToText, textToStr)
8586import Language.Javascript.JSC.Arguments ()
87+import Data.Word (Word)
8688
8789data JSNull = JSNull -- ^ Type that represents a value that can only be null.
8890 -- Haskell of course has no null so we are adding this type.
@@ -200,6 +202,33 @@ valToStr val = do
200202valToText :: MakeValueRef val => val -> JSC Text
201203valToText jsvar = valToStr jsvar >>= strToText
202204
205+-- | Given a JavaScript value get a JSON string value.
206+-- May throw JSException.
207+--
208+-- >>> testJSC $ valToJSON 0 JSNull >>= strToText
209+-- null
210+-- >>> testJSC $ valToJSON 0 () >>= strToText
211+--
212+-- >>> testJSC $ valToJSON 0 True >>= strToText
213+-- true
214+-- >>> testJSC $ valToJSON 0 False >>= strToText
215+-- false
216+-- >>> testJSC $ valToJSON 0 (1.0 :: Double) >>= strToText
217+-- 1
218+-- >>> testJSC $ valToJSON 0 (0.0 :: Double) >>= strToText
219+-- 0
220+-- >>> testJSC $ valToJSON 0 "" >>= strToText
221+-- ""
222+-- >>> testJSC $ valToJSON 0 "1" >>= strToText
223+-- "1"
224+-- >>> testJSC $ obj >>= valToJSON 0 >>= strToText
225+-- {}
226+valToJSON :: MakeValueRef val => Word -> val -> JSC JSStringRef
227+valToJSON indent val = do
228+ gctxt <- ask
229+ rval <- makeValueRef val
230+ rethrow $ liftIO . jsvaluecreatejsonstring gctxt rval (fromIntegral indent)
231+
203232-- | Given a JavaScript value get its object value.
204233-- May throw JSException.
205234--