Skip to content

Commit

Permalink
Improve oneOf errors
Browse files Browse the repository at this point in the history
  • Loading branch information
bowbahdoe committed Dec 27, 2022
1 parent 4e8720f commit 53fc8fe
Show file tree
Hide file tree
Showing 13 changed files with 82 additions and 50 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>dev.mccue</groupId>
<artifactId>json</artifactId>
<version>0.1.1</version>
<version>0.1.2</version>
<packaging>jar</packaging>

<properties>
Expand Down
27 changes: 4 additions & 23 deletions src/main/java/dev/mccue/json/Json.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package dev.mccue.json;

import dev.mccue.json.internal.*;
import dev.mccue.json.stream.JsonValueHandler;
import dev.mccue.json.stream.JsonWriteable;

import java.io.*;
import java.math.BigDecimal;
Expand Down Expand Up @@ -198,7 +200,7 @@ static JsonReader reader(Reader reader) {
.withEOFBehavior(EOFBehavior.RETURN_NULL));
}

static void readStream(Reader reader, Json.ValueHandler handler, StreamReadOptions options) throws IOException, JsonReadException {
static void readStream(Reader reader, JsonValueHandler handler, StreamReadOptions options) throws IOException, JsonReadException {
JsonReaderMethods.readStream(
new PushbackReader(reader, JsonReaderMethods.MINIMUM_PUSHBACK_BUFFER_SIZE),
false,
Expand All @@ -207,7 +209,7 @@ static void readStream(Reader reader, Json.ValueHandler handler, StreamReadOptio
);
}

static void readStream(Reader reader, Json.ValueHandler handler) throws IOException, JsonReadException {
static void readStream(Reader reader, JsonValueHandler handler) throws IOException, JsonReadException {
JsonReaderMethods.readStream(
new PushbackReader(reader, JsonReaderMethods.MINIMUM_PUSHBACK_BUFFER_SIZE),
false,
Expand Down Expand Up @@ -340,29 +342,8 @@ public EventReadOptions withUseBigDecimals(boolean useBigDecimals) {
}
}

interface ObjectHandler {
Json.ValueHandler onField(java.lang.String fieldName);

void objectEnd();
}

interface ArrayHandler extends Json.ValueHandler {
void onArrayEnd();
}

interface ValueHandler {
Json.ObjectHandler onObjectStart();

Json.ArrayHandler onArrayStart();

void onNumber(JsonNumber number);

void onString(java.lang.String value);

void onNull();

void onTrue();

void onFalse();
}
}
15 changes: 15 additions & 0 deletions src/main/java/dev/mccue/json/JsonDecoder.java
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,19 @@ static <T> T oneOf(Json json, JsonDecoder<? extends T> decoderA, JsonDecoder<? e
errors.add(e2);
}

throw JsonDecodeException.oneOf(Collections.unmodifiableList(errors));
}
catch (Exception e2) {
var errors = new ArrayList<JsonDecodeException>();
if (e1 instanceof JsonDecodeException.OneOf oneOf) {
errors.addAll(oneOf.getCauses());
}
else {
errors.add(e1);
}

errors.add(JsonDecodeException.of(e2, json));

throw JsonDecodeException.oneOf(Collections.unmodifiableList(errors));
}
}
Expand Down Expand Up @@ -469,6 +482,8 @@ static <T> T oneOf(Json json, JsonDecoder<? extends T> decoderA, JsonDecoder<? e
} else {
errors.add(e2);
}
} catch (Exception e2) {
errors.add(JsonDecodeException.of(e2, json));
}
}

Expand Down
1 change: 1 addition & 0 deletions src/main/java/dev/mccue/json/JsonEncodable.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.mccue.json;

import dev.mccue.json.stream.JsonGenerator;
import dev.mccue.json.stream.JsonWriteable;

/**
* An object that can be converted to JSON.
Expand Down
1 change: 0 additions & 1 deletion src/main/java/dev/mccue/json/JsonNull.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ private Object writeReplace() {
return new JsonSerializationProxy(Json.writeString(this));
}


@Serial
private Object readResolve() {
throw new IllegalStateException();
Expand Down
9 changes: 4 additions & 5 deletions src/main/java/dev/mccue/json/JsonNumber.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,10 @@
import java.io.Serial;
import java.math.BigDecimal;

public sealed abstract class JsonNumber extends java.lang.Number implements Json permits
BigDecimalImpl,
DoubleImpl,
LongImpl,
BigIntegerImpl {
public sealed abstract class JsonNumber
extends Number
implements Json
permits BigDecimalImpl, DoubleImpl, LongImpl, BigIntegerImpl {
@Serial
private static final long serialVersionUID = 1L;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,13 @@
import dev.mccue.json.JsonNumber;

class DelegatingJsonGenerator implements JsonGenerator {
private final Json.WriteOptions writeOptions;
private final Appendable out;
private JsonGenerator delegate;

DelegatingJsonGenerator(
Json.WriteOptions writeOptions,
Appendable out,
JsonGenerator delegate
) {
this.writeOptions = writeOptions;
this.out = out;
this.delegate = delegate;
}

Expand Down
25 changes: 14 additions & 11 deletions src/main/java/dev/mccue/json/internal/Handlers.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,23 @@
import dev.mccue.json.internal.ArrayBuilderImpl;
import dev.mccue.json.internal.ObjectBuilder;
import dev.mccue.json.internal.ValueCandidate;
import dev.mccue.json.stream.JsonArrayHandler;
import dev.mccue.json.stream.JsonObjectHandler;
import dev.mccue.json.stream.JsonValueHandler;

import java.util.function.Consumer;

final class Handlers {
private Handlers() {}

@ValueCandidate
record TreeObjectHandler(JsonObject.Builder builder, Consumer<JsonObject> onObject) implements Json.ObjectHandler {
record TreeObjectHandler(JsonObject.Builder builder, Consumer<JsonObject> onObject) implements JsonObjectHandler {
TreeObjectHandler(Consumer<JsonObject> onObject) {
this(Json.objectBuilder(), onObject);
}

@Override
public Json.ValueHandler onField(java.lang.String fieldName) {
public JsonValueHandler onField(java.lang.String fieldName) {
return new TreeValueHandler(value -> builder.put(fieldName, value));
}

Expand All @@ -31,7 +34,7 @@ public void objectEnd() {
record TreeArrayHandler(
JsonArray.Builder builder,
Consumer<JsonArray> onArray
) implements Json.ArrayHandler {
) implements JsonArrayHandler {
TreeArrayHandler(Consumer<JsonArray> onArray) {
this(Json.arrayBuilder(), onArray);
}
Expand All @@ -42,12 +45,12 @@ public void onArrayEnd() {
}

@Override
public Json.ObjectHandler onObjectStart() {
public JsonObjectHandler onObjectStart() {
return new TreeObjectHandler(builder::add);
}

@Override
public Json.ArrayHandler onArrayStart() {
public JsonArrayHandler onArrayStart() {
return new TreeArrayHandler(builder::add);
}

Expand Down Expand Up @@ -81,15 +84,15 @@ public void onFalse() {
* Basic handler that reads values into an immutable tree.
*/
@ValueCandidate
record TreeValueHandler(Consumer<Json> onValue) implements Json.ValueHandler {
record TreeValueHandler(Consumer<Json> onValue) implements JsonValueHandler {

@Override
public Json.ObjectHandler onObjectStart() {
public JsonObjectHandler onObjectStart() {
return new TreeObjectHandler(onValue::accept);
}

@Override
public Json.ArrayHandler onArrayStart() {
public JsonArrayHandler onArrayStart() {
return new TreeArrayHandler(onValue::accept);
}

Expand Down Expand Up @@ -119,7 +122,7 @@ public void onFalse() {
}
}

static final class BaseTreeValueHandler implements Json.ValueHandler {
static final class BaseTreeValueHandler implements JsonValueHandler {
Json result;
final TreeValueHandler delegate;

Expand All @@ -129,12 +132,12 @@ static final class BaseTreeValueHandler implements Json.ValueHandler {
}

@Override
public Json.ObjectHandler onObjectStart() {
public JsonObjectHandler onObjectStart() {
return delegate.onObjectStart();
}

@Override
public Json.ArrayHandler onArrayStart() {
public JsonArrayHandler onArrayStart() {
return delegate.onArrayStart();
}

Expand Down
10 changes: 6 additions & 4 deletions src/main/java/dev/mccue/json/internal/JsonReaderMethods.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@


import dev.mccue.json.Json;
import dev.mccue.json.stream.JsonArrayHandler;
import dev.mccue.json.stream.JsonEvent;
import dev.mccue.json.JsonNumber;
import dev.mccue.json.JsonReadException;
import dev.mccue.json.stream.JsonValueHandler;

import java.io.IOException;
import java.io.PushbackReader;
Expand Down Expand Up @@ -385,7 +387,7 @@ private static boolean readAlse(PushbackReader stream) throws IOException {
private static void readArrayHelperStream(
PushbackReader stream,
Json.StreamReadOptions options,
Json.ArrayHandler arrayHandler
JsonArrayHandler arrayHandler
) throws IOException {
while (true) {
readStream(stream, true, options, arrayHandler);
Expand All @@ -404,7 +406,7 @@ private static void readArrayHelperStream(
private static void readArrayStream(
PushbackReader stream,
Json.StreamReadOptions options,
Json.ValueHandler valueHandler
JsonValueHandler valueHandler
) throws IOException {
var arrayHandler = valueHandler.onArrayStart();
var c = nextToken(stream);
Expand All @@ -423,7 +425,7 @@ private static void readArrayStream(
private static void readObjectStream(
PushbackReader stream,
Json.StreamReadOptions options,
Json.ValueHandler valueHandler
JsonValueHandler valueHandler
) throws IOException {
boolean readSomeEntry = false;
var objectHandler = valueHandler.onObjectStart();
Expand Down Expand Up @@ -459,7 +461,7 @@ public static void readStream(
PushbackReader stream,
boolean throwIfEofEncountered,
Json.StreamReadOptions options,
Json.ValueHandler valueHandler
JsonValueHandler valueHandler
) throws IOException {
int c = nextToken(stream);
switch (c) {
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/dev/mccue/json/stream/JsonArrayHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package dev.mccue.json.stream;

import dev.mccue.json.Json;

public interface JsonArrayHandler extends JsonValueHandler {
void onArrayEnd();
}
9 changes: 9 additions & 0 deletions src/main/java/dev/mccue/json/stream/JsonObjectHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.mccue.json.stream;


public interface JsonObjectHandler {
JsonValueHandler onField(String fieldName);

void objectEnd();
}

20 changes: 20 additions & 0 deletions src/main/java/dev/mccue/json/stream/JsonValueHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package dev.mccue.json.stream;

import dev.mccue.json.Json;
import dev.mccue.json.JsonNumber;

public interface JsonValueHandler {
JsonObjectHandler onObjectStart();

JsonArrayHandler onArrayStart();

void onNumber(JsonNumber number);

void onString(String value);

void onNull();

void onTrue();

void onFalse();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.mccue.json;
package dev.mccue.json.stream;

import dev.mccue.json.stream.JsonGenerator;

Expand Down

0 comments on commit 53fc8fe

Please sign in to comment.