refactor
authorJoey Hess <joeyh@joeyh.name>
Fri, 9 Sep 2016 20:39:21 +0000 (16:39 -0400)
committerJoey Hess <joeyh@joeyh.name>
Fri, 9 Sep 2016 20:39:21 +0000 (16:39 -0400)
Messages/JSON.hs
Utility/JSONStream.hs

index 3baeaef3f6318d67ac9c0fc4ddf2efb9e27c73c8..e8491c691a12e3cac8aca1d68400c160ad9e6e3b 100644 (file)
@@ -80,9 +80,7 @@ complete v = Stream.start v `B.append` Stream.end
 progress :: B.ByteString -> Integer -> BytesProcessed -> IO ()
 progress jsonbuffer size bytesprocessed = emit $ B.concat
        [ Stream.start $ Stream.AesonObject o
-       , ",\"action\":"
-       , jsonbuffer
-       , "}"
+       , Stream.addNestedObject "action" jsonbuffer
        , Stream.end
        ]
   where
index c5d4e1c8dedfb21683b690adfd7a4cefd20d3b50..45978ef06f6c7f363025bf92a473629a7dc5da7d 100644 (file)
@@ -5,30 +5,32 @@
  - License: BSD-2-clause
  -}
 
-{-# LANGUAGE GADTs #-}
+{-# LANGUAGE GADTs, OverloadedStrings #-}
 
 module Utility.JSONStream (
        JSONChunk(..),
        start,
        add,
+       addNestedObject,
        end
 ) where
 
 import Data.Aeson
 import qualified Data.Text as T
 import qualified Data.ByteString.Lazy as B
+import qualified Data.ByteString.Lazy.UTF8 as BU8
 import Data.Char
 import Data.Word
 
 data JSONChunk v where
-       JSONChunk :: ToJSON v => [(String, v)] -> JSONChunk [(String, v)]
        AesonObject :: Object -> JSONChunk Object
+       JSONChunk :: ToJSON v => [(String, v)] -> JSONChunk [(String, v)]
 
 encodeJSONChunk :: JSONChunk v -> B.ByteString
+encodeJSONChunk (AesonObject o) = encode o
 encodeJSONChunk (JSONChunk l) = encode $ object $ map mkPair l
   where
        mkPair (s, v) = (T.pack s, toJSON v)
-encodeJSONChunk (AesonObject o) = encode o
 
 {- Aeson does not support building up a larger JSON object piece by piece
  - with streaming output. To support streaming, a hack:
@@ -43,11 +45,21 @@ start a
 
 add :: JSONChunk a -> B.ByteString
 add a
-       | not (B.null b) && B.head b == startchar = B.cons addchar (B.drop 1 b)
+       | not (B.null b) && B.head b == startchar = 
+               B.cons addchar (B.drop 1 b)
        | otherwise = bad b
   where
        b = start a
 
+addNestedObject :: String -> B.ByteString -> B.ByteString
+addNestedObject s b = B.concat
+       [ ",\""
+       , BU8.fromString s
+       , "\":"
+       , b
+       , "}"
+       ]
+
 end :: B.ByteString
 end = endchar `B.cons` sepchar `B.cons` B.empty