package moe.nea.pcj.json; import moe.nea.pcj.Codec; import moe.nea.pcj.Result; public interface JsonCodec extends Codec< T, Format, JsonLikeOperations, JsonLikeError, JsonLikeError> { default MapCodec fieldOf(String key) { return new MapCodec<>() { @Override public Result decode(RecordView record, JsonLikeOperations ops) { return record.get(key) .map(element -> Result.cast( JsonCodec.this.decode(element, ops) .mapError(it -> new AtField(key, it)))) .orElseGet(() -> Result.fail(new MissingKey(key))); } @Override public Result, JsonLikeError> encode(T value, JsonLikeOperations ops) { var record = ops.createObject(); return Result.cast(JsonCodec.this.encode(value, ops)) .mapError(it -> new AtField(key, it)) .flatMap(json -> Result.cast(record.add(key, json).map(unit -> record))); } }; } }