ByteStringTypeAdapter.java

package net.morimekta.proto.gson.adapter;

import com.google.gson.JsonParseException;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import com.google.protobuf.ByteString;

import java.io.IOException;

import static net.morimekta.proto.utils.ByteStringUtil.fromBase64;
import static net.morimekta.proto.utils.ByteStringUtil.toBase64;

/**
 * Adapter for handling byte strings.
 */
public class ByteStringTypeAdapter extends TypeAdapter<ByteString> {
    @Override
    public void write(JsonWriter jsonWriter, ByteString bytes) throws IOException {
        jsonWriter.value(toBase64(bytes));
    }

    @Override
    public ByteString read(JsonReader jsonReader) throws IOException {
        if (jsonReader.peek() == JsonToken.NULL) {
            jsonReader.nextNull();
            return null;
        }
        try {
            return fromBase64(jsonReader.nextString());
        } catch (IllegalArgumentException e) {
            throw new JsonParseException(
                    "Invalid base64 at " + jsonReader.getPreviousPath() + ": " + e.getMessage(), e);
        }
    }
}