Skip to content

Commit bc9558e

Browse files
committed
Convert Json module from String to ByteString
1 parent 44cfe7d commit bc9558e

File tree

6 files changed

+63
-57
lines changed

6 files changed

+63
-57
lines changed

Cabal/Cabal.cabal

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ library
349349

350350
if !impl(ghc >= 7.8)
351351
-- semigroups depends on tagged.
352-
build-depends: tagged >=0.8.6 && <0.9
352+
build-depends: tagged >=0.8.6 && <0.9, bytestring-builder >= 0.10.8 && <0.11
353353

354354
exposed-modules:
355355
Distribution.Backpack
@@ -527,6 +527,7 @@ library
527527
Distribution.Types.GivenComponent
528528
Distribution.Types.PackageVersionConstraint
529529
Distribution.Utils.Generic
530+
Distribution.Utils.Json
530531
Distribution.Utils.NubList
531532
Distribution.Utils.ShortText
532533
Distribution.Utils.Progress
@@ -609,7 +610,6 @@ library
609610
Distribution.Simple.GHC.EnvironmentParser
610611
Distribution.Simple.GHC.Internal
611612
Distribution.Simple.GHC.ImplInfo
612-
Distribution.Simple.Utils.Json
613613
Distribution.ZinzaPrelude
614614
Paths_Cabal
615615

@@ -689,7 +689,7 @@ test-suite unit-tests
689689
Distribution.Described
690690
Distribution.Utils.CharSet
691691
Distribution.Utils.GrammarRegex
692-
692+
693693
main-is: UnitTests.hs
694694
build-depends:
695695
array,

Cabal/Distribution/Simple.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ import Distribution.Compat.Directory (makeAbsolute)
104104
import Distribution.Compat.Environment (getEnvironment)
105105
import Distribution.Compat.GetShortPathName (getShortPathName)
106106

107+
import qualified Data.ByteString.Lazy as B
107108
import Data.List (unionBy, (\\))
108109

109110
import Distribution.PackageDescription.Parsec
@@ -286,8 +287,8 @@ showBuildInfoAction hooks (ShowBuildInfoFlags flags fileOutput) args = do
286287
buildInfoString <- showBuildInfo pkg_descr lbi' flags
287288

288289
case fileOutput of
289-
Nothing -> putStr buildInfoString
290-
Just fp -> writeFile fp buildInfoString
290+
Nothing -> B.putStr buildInfoString
291+
Just fp -> B.writeFile fp buildInfoString
291292

292293
postBuild hooks args flags' pkg_descr lbi'
293294

Cabal/Distribution/Simple/Build.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ import Distribution.Simple.Configure
7676
import Distribution.Simple.Register
7777
import Distribution.Simple.Test.LibV09
7878
import Distribution.Simple.Utils
79-
import Distribution.Simple.Utils.Json
79+
import Distribution.Utils.Json
8080

8181
import Distribution.System
8282
import Distribution.Pretty
@@ -86,6 +86,7 @@ import Distribution.Version (thisVersion)
8686
import Distribution.Compat.Graph (IsNode(..))
8787

8888
import Control.Monad
89+
import Data.ByteString.Lazy (ByteString)
8990
import qualified Data.Set as Set
9091
import System.FilePath ( (</>), (<.>), takeDirectory )
9192
import System.Directory ( getCurrentDirectory )
@@ -135,13 +136,13 @@ build pkg_descr lbi flags suffixes = do
135136
showBuildInfo :: PackageDescription -- ^ Mostly information from the .cabal file
136137
-> LocalBuildInfo -- ^ Configuration information
137138
-> BuildFlags -- ^ Flags that the user passed to build
138-
-> IO String
139+
-> IO ByteString
139140
showBuildInfo pkg_descr lbi flags = do
140141
let verbosity = fromFlag (buildVerbosity flags)
141142
targets <- readTargetInfos verbosity pkg_descr lbi (buildArgs flags)
142143
let targetsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
143144
doc = mkBuildInfo pkg_descr lbi flags targetsToBuild
144-
return $ renderJson doc ""
145+
return $ renderJson doc
145146

146147

147148
repl :: PackageDescription -- ^ Mostly information from the .cabal file

Cabal/Distribution/Simple/ShowBuildInfo.hs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ import Distribution.Simple.LocalBuildInfo
7070
import Distribution.Simple.Program
7171
import Distribution.Simple.Setup
7272
import Distribution.Simple.Utils (cabalVersion)
73-
import Distribution.Simple.Utils.Json
73+
import Distribution.Utils.Json
7474
import Distribution.Types.TargetInfo
7575
import Distribution.Text
7676
import Distribution.Pretty
@@ -88,8 +88,6 @@ mkBuildInfo pkg_descr lbi _flags targetsToBuild = info
8888
targetToNameAndLBI target =
8989
(componentLocalName $ targetCLBI target, targetCLBI target)
9090
componentsToBuild = map targetToNameAndLBI targetsToBuild
91-
(.=) :: String -> Json -> (String, Json)
92-
k .= v = (k, v)
9391

9492
info = JsonObject
9593
[ "cabal-version" .= JsonString (display cabalVersion)

Cabal/Distribution/Simple/Utils/Json.hs

Lines changed: 0 additions & 46 deletions
This file was deleted.

Cabal/Distribution/Utils/Json.hs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
{-# LANGUAGE RankNTypes #-}
2+
{-# LANGUAGE OverloadedStrings #-}
3+
-- | Extremely simple JSON helper. Don't do anything too fancy with this!
4+
5+
module Distribution.Utils.Json
6+
( Json(..)
7+
, (.=)
8+
, renderJson
9+
) where
10+
11+
import Distribution.Compat.Prelude
12+
import qualified Data.ByteString.Lazy as LBS
13+
import Data.ByteString.Builder
14+
( Builder, stringUtf8, intDec, toLazyByteString )
15+
16+
data Json = JsonArray [Json]
17+
| JsonBool !Bool
18+
| JsonNull
19+
| JsonNumber !Int -- No support for Floats, Doubles just yet
20+
| JsonObject [(String, Json)]
21+
| JsonString !String
22+
23+
-- | Convert a 'Json' into a 'ByteString'
24+
renderJson :: Json -> LBS.ByteString
25+
renderJson json = toLazyByteString (go json)
26+
where
27+
go (JsonArray objs) =
28+
surround "[" "]" $ mconcat $ intersperse "," $ map go objs
29+
go (JsonBool True) = stringUtf8 "true"
30+
go (JsonBool False) = stringUtf8 "false"
31+
go JsonNull = stringUtf8 "null"
32+
go (JsonNumber n) = intDec n
33+
go (JsonObject attrs) =
34+
surround "{" "}" $ mconcat $ intersperse "," $ map render attrs
35+
where
36+
render (k,v) = (surround "\"" "\"" $ stringUtf8 (escape k)) <> ":" <> go v
37+
go (JsonString s) = surround "\"" "\"" $ stringUtf8 (escape s)
38+
39+
surround :: Builder -> Builder -> Builder -> Builder
40+
surround begin end middle = mconcat [ begin , middle , end]
41+
42+
escape :: String -> String
43+
escape ('\"':xs) = "\\\"" <> escape xs
44+
escape ('\\':xs) = "\\\\" <> escape xs
45+
escape ('\'':xs) = "\\\'" <> escape xs
46+
escape (x:xs) = x : escape xs
47+
escape [] = mempty
48+
49+
-- | A shorthand for building up 'JsonObject's
50+
-- > JsonObject [ "a" .= JsonNumber 42, "b" .= JsonBool True ]
51+
(.=) :: String -> Json -> (String, Json)
52+
k .= v = (k, v)

0 commit comments

Comments
 (0)