Skip to content

Commit 9e33d89

Browse files
committed
Make implementation private
1 parent f627d37 commit 9e33d89

File tree

1 file changed

+46
-33
lines changed

1 file changed

+46
-33
lines changed

lib/src/main/kotlin/konnik/json/JsonParser.kt

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ sealed interface JsonValue {
1818
* @return json value or null if parsing fails
1919
*/
2020
fun parseJson(input: String): JsonValue? =
21-
when (val result = jsonParser(input)) {
21+
when (val result = json(input)) {
2222
null -> null
2323
else -> when (result.second) {
2424
"" -> result.first
@@ -27,50 +27,63 @@ fun parseJson(input: String): JsonValue? =
2727
}
2828

2929

30+
/*
31+
* Implementation of the grammar from https://www.json.org/json-en.html follows.
32+
*
33+
* The parsers defined below are given names that follows the grammar but due to Kotlin
34+
* initialization orders the ordering are not the same.
35+
*
36+
* The parsers are declared as toplevel val's to minimize noise on the use site. This makes
37+
* the parser very readable, and it almost reads as the official grammar.
38+
*
39+
* To be able to define some recursive parsers a "lazy" variant of some parsers was needed,
40+
* in the form of a function that lazily returns the corresponding parser.
41+
*/
42+
3043

3144
/**
3245
* Consumes zero or more whitespace characters.
3346
*/
34-
val ws: Parser<String> = oneOf(
47+
private val ws: Parser<String> = oneOf(
3548
s("\u0020") + _ws(),
3649
s("\u000A") + _ws(),
3750
s("\u000D") + _ws(),
3851
s("\u0009") + _ws(),
3952
succeed("")
4053
)
4154

42-
fun _ws(): Parser<String> = lazy { ws }
55+
private fun _ws(): Parser<String> = lazy { ws }
4356

4457

4558
/**
4659
* Matches a single digit 1 to 9.
4760
*/
48-
val onenine: Parser<String> =
61+
private val onenine: Parser<String> =
4962
match { it in '1'..'9' }.map { it.toString() }
5063

5164
/**
5265
* Matches a single digit 0 to 9.
5366
*/
54-
val digit: Parser<String> = oneOf(
67+
private val digit: Parser<String> = oneOf(
5568
s("0"),
5669
onenine
5770
)
5871

5972
/**
6073
* Matches one or more digits.
6174
*/
62-
val digits: Parser<String> = oneOf(
75+
private val digits: Parser<String> = oneOf(
6376
digit + _digits(),
6477
digit
6578
)
6679

67-
fun _digits() = lazy { digits }
80+
private fun _digits() = lazy { digits }
6881

6982

7083
/**
7184
* Parse an integer that can start with a minus sign.
7285
*/
73-
val integer: Parser<String> = oneOf(
86+
private val integer: Parser<String> = oneOf(
7487
onenine + digits,
7588
digit,
7689
s("-") + onenine + digits,
@@ -83,15 +96,15 @@ val integer: Parser<String> = oneOf(
8396
*
8497
* If no fraction is found an empty string is produced.
8598
*/
86-
val fraction: Parser<String> = oneOf(
99+
private val fraction: Parser<String> = oneOf(
87100
s(".") + digits,
88101
succeed("")
89102
)
90103

91104
/**
92105
* Parse an optional sign. If no sign is found the empty string is produced.
93106
*/
94-
val sign: Parser<String> = oneOf(
107+
private val sign: Parser<String> = oneOf(
95108
s("+"),
96109
s("-"),
97110
succeed("")
@@ -100,7 +113,7 @@ val sign: Parser<String> = oneOf(
100113
/**
101114
* Parse an optional exponent. If no exponent is found the empty string is produced.
102115
*/
103-
val exponent: Parser<String> = oneOf(
116+
private val exponent: Parser<String> = oneOf(
104117
s("E") + sign + digits,
105118
s("e") + sign + digits,
106119
succeed("")
@@ -110,14 +123,14 @@ val exponent: Parser<String> = oneOf(
110123
/**
111124
* Parse a JSON number.
112125
*/
113-
val number: Parser<String> =
126+
private val number: Parser<String> =
114127
integer + fraction + exponent
115128

116129

117130
/**
118131
* Parse one hex digit (both lower and upper case allowed)
119132
*/
120-
val hex: Parser<String> = oneOf(
133+
private val hex: Parser<String> = oneOf(
121134
digit,
122135
match { it in 'A'..'F' }.map { it.toString() },
123136
match { it in 'a'..'f' }.map { it.toString() },
@@ -127,7 +140,7 @@ val hex: Parser<String> = oneOf(
127140
* Parse an escaped value in a JSON string, i.e. a sequence
128141
* of characters following a backslash (\).
129142
*/
130-
val escape: Parser<String> = oneOf(
143+
private val escape: Parser<String> = oneOf(
131144
s("\"").map { "\"" },
132145
s("\\").map { "\\" },
133146
s("/").map { "/" },
@@ -144,38 +157,38 @@ val escape: Parser<String> = oneOf(
144157
/**
145158
* Parse one character in a JSON string. The character can be escaped by a backslash (\).
146159
*/
147-
val character: Parser<String> = oneOf(
160+
private val character: Parser<String> = oneOf(
148161
match { it >= '\u0020' && it != '\"' && it != '\\' }.map { it.toString() }, // "
149162
s("\\").keep(escape)
150163
)
151164

152165
/**
153166
* Parse zero or more valid characters in a JSON string.
154167
*/
155-
val characters: Parser<String> = oneOf(
168+
private val characters: Parser<String> = oneOf(
156169
character + _characters(),
157170
succeed("")
158171
)
159172

160-
fun _characters() = lazy { characters }
173+
private fun _characters() = lazy { characters }
161174

162175

163176
/**
164177
* Parse a JSON string.
165178
*/
166-
val string: Parser<String> =
179+
private val string: Parser<String> =
167180
s("\"").keep(characters).skip(s("\""))
168181

169182
/**
170183
* Parse an element. An element is a json value surrounded by whitespace.
171184
*/
172-
val element: Parser<JsonValue> =
185+
private val element: Parser<JsonValue> =
173186
ws.keep(_jsonValue()).skip(ws)
174187

175188
/**
176189
* Parse one or more elements separated by comma (,).
177190
*/
178-
val elements: Parser<List<JsonValue>> = oneOf(
191+
private val elements: Parser<List<JsonValue>> = oneOf(
179192
element.skip(s(",")).andThen { first ->
180193
_elements().map { rest ->
181194
listOf(first) + rest
@@ -184,12 +197,12 @@ val elements: Parser<List<JsonValue>> = oneOf(
184197
element.map { listOf(it) },
185198
)
186199

187-
fun _elements(): Parser<List<JsonValue>> = lazy { elements }
200+
private fun _elements(): Parser<List<JsonValue>> = lazy { elements }
188201

189202
/**
190203
* Parse one member. A member is one key-value pair in a JSON object.
191204
*/
192-
val member: Parser<Pair<String, JsonValue>> =
205+
private val member: Parser<Pair<String, JsonValue>> =
193206
ws.keep(string).skip(ws).skip(s(":")).andThen { key ->
194207
element.map { value ->
195208
key to value
@@ -199,7 +212,7 @@ val member: Parser<Pair<String, JsonValue>> =
199212
/**
200213
* Parse one or more members separated by a comma (,).
201214
*/
202-
val members: Parser<List<Pair<String, JsonValue>>> = oneOf(
215+
private val members: Parser<List<Pair<String, JsonValue>>> = oneOf(
203216
member.skip(s(",")).andThen { first ->
204217
_members().map { rest ->
205218
listOf(first) + rest
@@ -208,40 +221,40 @@ val members: Parser<List<Pair<String, JsonValue>>> = oneOf(
208221
member.map { listOf(it) }
209222
)
210223

211-
fun _members(): Parser<List<Pair<String, JsonValue>>> = members
224+
private fun _members(): Parser<List<Pair<String, JsonValue>>> = members
212225

213226

214227
/**
215228
* Parse a JSON boolean.
216229
*/
217-
val jsBool: Parser<JsonValue> = oneOf(
230+
private val jsBool: Parser<JsonValue> = oneOf(
218231
s("true").map { JsonValue.Bool(true) },
219232
s("false").map { JsonValue.Bool(false) }
220233
)
221234

222235
/**
223236
* Parse a JSON null.
224237
*/
225-
val jsNull: Parser<JsonValue> =
238+
private val jsNull: Parser<JsonValue> =
226239
s("null").map { JsonValue.Null }
227240

228241

229242
/**
230243
* Parse a JSON number.
231244
*/
232-
val jsNum: Parser<JsonValue> =
245+
private val jsNum: Parser<JsonValue> =
233246
number.map { JsonValue.Num(it.toDouble()) }
234247

235248
/**
236249
* Parse a JSON string.
237250
*/
238-
val jsString: Parser<JsonValue> =
251+
private val jsString: Parser<JsonValue> =
239252
string.map { JsonValue.Str(it) }
240253

241254
/**
242255
* Parse a JSON array.
243256
*/
244-
val jsArray: Parser<JsonValue> = oneOf(
257+
private val jsArray: Parser<JsonValue> = oneOf(
245258
s("[").andThen { ws }.andThen { s("]") }.map { JsonValue.Array(emptyList<JsonValue>()) },
246259
s("[").keep(_elements()).skip(s("]")).map { JsonValue.Array(it) },
247260
)
@@ -250,15 +263,15 @@ val jsArray: Parser<JsonValue> = oneOf(
250263
/**
251264
* Parse a JSON object.
252265
*/
253-
val jsObject: Parser<JsonValue> = oneOf(
266+
private val jsObject: Parser<JsonValue> = oneOf(
254267
s("{").keep(members).skip(s("}")).map { JsonValue.Object(it.toMap()) },
255268
s("{").skip(ws).keep(s("}")).map { JsonValue.Object(emptyMap()) },
256269
)
257270

258271
/**
259272
* Parse a JSON value.
260273
*/
261-
val jsonValue: Parser<JsonValue> = oneOf(
274+
private val jsonValue: Parser<JsonValue> = oneOf(
262275
jsNull,
263276
jsBool,
264277
jsString,
@@ -267,7 +280,7 @@ val jsonValue: Parser<JsonValue> = oneOf(
267280
jsObject
268281
)
269282

270-
fun _jsonValue() = lazy { jsonValue }
283+
private fun _jsonValue() = lazy { jsonValue }
271284

272285

273-
val jsonParser: Parser<JsonValue> = element
286+
private val json: Parser<JsonValue> = element

0 commit comments

Comments
 (0)