@@ -3,19 +3,19 @@ defmodule Jason do
3
3
A blazing fast JSON parser and generator in pure Elixir.
4
4
"""
5
5
6
+ alias Jason . { Encode , Decoder , DecodeError , EncodeError , Formatter }
7
+
6
8
@ type escape :: :json | :unicode_safe | :html_safe | :javascript_safe
7
9
@ type maps :: :naive | :strict
8
10
9
- @ type encode_opt :: { :escape , escape } | { :maps , maps }
11
+ @ type encode_opt :: { :escape , escape } | { :maps , maps } | { :pretty , true | Formatter . opts ( ) }
10
12
11
13
@ type keys :: :atoms | :atoms! | :strings | :copy | ( String . t ( ) -> term )
12
14
13
15
@ type strings :: :reference | :copy
14
16
15
17
@ type decode_opt :: { :keys , keys } | { :strings , strings }
16
18
17
- alias Jason . { Encode , Decoder , DecodeError , EncodeError }
18
-
19
19
@ doc """
20
20
Parses a JSON value from `input` iodata.
21
21
@@ -105,6 +105,11 @@ defmodule Jason do
105
105
rejected, since both keys would be encoded to the string `"foo"`.
106
106
* `:naive` (default) - does not perform the check.
107
107
108
+ * `:pretty` - controls pretty printing of the output. Possible values are:
109
+
110
+ * `true` to pretty print with default configuration
111
+ * a keyword of options as specified by `Jason.Formatter.pretty_print/2`.
112
+
108
113
## Examples
109
114
110
115
iex> Jason.encode(%{a: 1})
@@ -117,7 +122,7 @@ defmodule Jason do
117
122
@ spec encode ( term , [ encode_opt ] ) ::
118
123
{ :ok , String . t ( ) } | { :error , EncodeError . t ( ) | Exception . t ( ) }
119
124
def encode ( input , opts \\ [ ] ) do
120
- case Encode . encode ( input , format_encode_opts ( opts ) ) do
125
+ case do_encode ( input , format_encode_opts ( opts ) ) do
121
126
{ :ok , result } -> { :ok , IO . iodata_to_binary ( result ) }
122
127
{ :error , error } -> { :error , error }
123
128
end
@@ -140,7 +145,7 @@ defmodule Jason do
140
145
"""
141
146
@ spec encode! ( term , [ encode_opt ] ) :: String . t ( ) | no_return
142
147
def encode! ( input , opts \\ [ ] ) do
143
- case Encode . encode ( input , format_encode_opts ( opts ) ) do
148
+ case do_encode ( input , format_encode_opts ( opts ) ) do
144
149
{ :ok , result } -> IO . iodata_to_binary ( result )
145
150
{ :error , error } -> raise error
146
151
end
@@ -168,7 +173,7 @@ defmodule Jason do
168
173
@ spec encode_to_iodata ( term , [ encode_opt ] ) ::
169
174
{ :ok , iodata } | { :error , EncodeError . t ( ) | Exception . t ( ) }
170
175
def encode_to_iodata ( input , opts \\ [ ] ) do
171
- Encode . encode ( input , format_encode_opts ( opts ) )
176
+ do_encode ( input , format_encode_opts ( opts ) )
172
177
end
173
178
174
179
@ doc """
@@ -189,12 +194,30 @@ defmodule Jason do
189
194
"""
190
195
@ spec encode_to_iodata! ( term , [ encode_opt ] ) :: iodata | no_return
191
196
def encode_to_iodata! ( input , opts \\ [ ] ) do
192
- case Encode . encode ( input , format_encode_opts ( opts ) ) do
197
+ case do_encode ( input , format_encode_opts ( opts ) ) do
193
198
{ :ok , result } -> result
194
199
{ :error , error } -> raise error
195
200
end
196
201
end
197
202
203
+ defp do_encode ( input , % { pretty: true } = opts ) do
204
+ case Encode . encode ( input , opts ) do
205
+ { :ok , encoded } -> { :ok , Formatter . pretty_print_to_iodata ( encoded ) }
206
+ other -> other
207
+ end
208
+ end
209
+
210
+ defp do_encode ( input , % { pretty: pretty } = opts ) do
211
+ case Encode . encode ( input , opts ) do
212
+ { :ok , encoded } -> { :ok , Formatter . pretty_print_to_iodata ( encoded , pretty ) }
213
+ other -> other
214
+ end
215
+ end
216
+
217
+ defp do_encode ( input , opts ) do
218
+ Encode . encode ( input , opts )
219
+ end
220
+
198
221
defp format_encode_opts ( opts ) do
199
222
Enum . into ( opts , % { escape: :json , maps: :naive } )
200
223
end
0 commit comments