package com.onthegomap.planetiler.stream; import com.google.common.base.Suppliers; import java.util.Base64; import java.util.HexFormat; import java.util.List; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Stream; enum CsvBinaryEncoding { BASE64("base64", () -> Base64.getEncoder()::encodeToString, () -> Base64.getDecoder()::decode), HEX("hex", () -> HexFormat.of()::formatHex, () -> HexFormat.of()::parseHex); private final String id; private final Supplier> encoder; private final Supplier> decoder; private CsvBinaryEncoding(String id, Supplier> encoder, Supplier> decoder) { this.id = id; this.encoder = Suppliers.memoize(encoder::get); this.decoder = Suppliers.memoize(decoder::get); } String encode(byte[] b) { return encoder.get().apply(b); } byte[] decode(String s) { return decoder.get().apply(s); } static List ids() { return Stream.of(CsvBinaryEncoding.values()).map(CsvBinaryEncoding::id).toList(); } static CsvBinaryEncoding fromId(String id) { return Stream.of(CsvBinaryEncoding.values()) .filter(de -> de.id().equals(id)) .findFirst() .orElseThrow(() -> new IllegalArgumentException( "unexpected binary encoding - expected one of " + ids() + " but got " + id)); } String id() { return id; } }