Skip to content
This repository has been archived by the owner on Jan 27, 2025. It is now read-only.

Commit

Permalink
Apply rename Fix function recursively. (#103)
Browse files Browse the repository at this point in the history
Catmandu operates on both arrays and hashes.
  • Loading branch information
blackwinter committed Jan 21, 2022
1 parent d802933 commit 1eebaac
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 5 deletions.
24 changes: 22 additions & 2 deletions metafix/src/main/java/org/metafacture/metafix/FixMethod.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -196,9 +197,28 @@ public void apply(final Metafix metafix, final Record record, final List<String>
final String search = params.get(1);
final String replace = params.get(2);

// TODO: recurse into arrays/values
final UnaryOperator<String> operator = s -> s.replaceAll(search, replace);

record.transformField(params.get(0), (m, c) -> m
.ifHash(h -> c.accept(Value.newHash(n -> h.forEach((f, w) -> n.put(f.replaceAll(search, replace), w)))))
.ifArray(a -> c.accept(renameArray(a, operator)))
.ifHash(h -> c.accept(renameHash(h, operator)))
.orElseThrow()
);
}

private Value renameArray(final Value.Array array, final UnaryOperator<String> operator) {
return Value.newArray(a -> array.forEach(v -> a.add(renameValue(v, operator))));
}

private Value renameHash(final Value.Hash hash, final UnaryOperator<String> operator) {
return Value.newHash(h -> hash.forEach((f, v) -> h.put(operator.apply(f), renameValue(v, operator))));
}

private Value renameValue(final Value value, final UnaryOperator<String> operator) {
return value.extractType((m, c) -> m
.ifArray(a -> c.accept(renameArray(a, operator)))
.ifHash(h -> c.accept(renameHash(h, operator)))
.orElse(c)
);
}
},
Expand Down
2 changes: 1 addition & 1 deletion metafix/src/main/java/org/metafacture/metafix/Value.java
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ public TypeMatcher matchType() {
return new TypeMatcher(this);
}

private <T> T extractType(final BiConsumer<TypeMatcher, Consumer<T>> consumer) {
public <T> T extractType(final BiConsumer<TypeMatcher, Consumer<T>> consumer) {
final AtomicReference<T> result = new AtomicReference<>();
consumer.accept(matchType(), result::set);
return result.get();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1907,7 +1907,7 @@ public void shouldRenameFieldsInHash() {
}

@Test
@Disabled("See https://github.com/metafacture/metafacture-fix/issues/100")
// See https://github.com/metafacture/metafacture-fix/issues/100
public void shouldRecursivelyRenameFieldsInHash() {
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
"rename(others, ani, QR)"
Expand Down Expand Up @@ -1937,7 +1937,7 @@ public void shouldRecursivelyRenameFieldsInHash() {
}

@Test
@Disabled("See https://github.com/metafacture/metafacture-fix/issues/100")
// See https://github.com/metafacture/metafacture-fix/issues/100
public void shouldRecursivelyRenameFieldsInArray() {
MetafixTestHelpers.assertFix(streamReceiver, Arrays.asList(
"rename('animals[]', ani, XY)"
Expand Down

0 comments on commit 1eebaac

Please sign in to comment.