35 private record Key(String operation, String code) {
38 private final Map<Key, HttpError> rules;
41 private CodeBasedDomainErrorMapper(
final Map<Key, HttpError> rules,
final HttpError fallback) {
42 this.rules = Map.copyOf(rules);
43 this.fallback = fallback;
47 public HttpError map(
final String operation,
final String code,
final Throwable cause) {
48 final var byOperation = rules.get(
new Key(normalize(operation), normalize(code)));
49 if (byOperation !=
null) {
52 final var byWildcardOp = rules.get(
new Key(
"*", normalize(code)));
53 if (byWildcardOp !=
null) {
63 private static String normalize(
final String value) {
64 return value ==
null || value.isBlank() ?
"*" : value.trim();
67 public static final class Builder {
69 private final Map<Key, HttpError> rules =
new HashMap<>();
72 public Builder rule(
final String operation,
final String code,
final int status,
final String error,
73 final String message) {
74 final var key =
new Key(normalize(operation), normalize(code));
75 rules.put(key,
new HttpError(status, error, message));
79 public Builder fallback(
final int status,
final String error,
final String message) {
80 fallback =
new HttpError(status, error, message);
84 public CodeBasedDomainErrorMapper build() {
85 return new CodeBasedDomainErrorMapper(rules, Objects.requireNonNull(fallback));
HttpError map(final String operation, final String code, final Throwable cause)