// Path: src/main/java/de/skuzzle/enforcer/restrictimports/util/StringRepresentation.java
// public final class StringRepresentation {
// 
//     private final String name;
//     private final List<Attribute> attributes = new ArrayList<>();
// 
//     private StringRepresentation(String name) {
//         this.name = name;
//     }
// 
//     public static StringRepresentation ofType(Class<?> type) {
//         return new StringRepresentation(type.getSimpleName());
//     }
// 
//     public static StringRepresentation ofInstance(Object instance) {
//         return ofType(instance.getClass());
//     }
// 
//     public StringRepresentation add(String attribute, Object value) {
//         attributes.add(new Attribute(attribute, value));
//         return this;
//     }
// 
//     @Override
//     public String toString() {
//         return new StringBuilder(name)
//                 .append("{")
//                 .append(attributes.stream().map(Attribute::toString).collect(Collectors.joining(", ")))
//                 .append("}")
//                 .toString();
//     }
// 
//     private static final class Attribute {
//         private final String name;
//         private final Object value;
// 
//         private Attribute(String name, Object value) {
//             this.name = name;
//             this.value = value;
//         }
// 
//         @Override
//         public String toString() {
//             return name + "=" + value;
//         }
//     }
// }


import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import de.skuzzle.enforcer.restrictimports.util.StringRepresentation;
     *
     * @return Analysis duration in ms.
     */
    public Duration duration() {
        return this.duration;
    }

    /**
     * The number of files that have been analysed.
     *
     * @return Number of files.
     */
    public int analysedFiles() {
        return this.analysedFiles;
    }

    @Override
    public int hashCode() {
        return Objects.hash(srcMatches, testMatches);
    }

    @Override
    public boolean equals(Object obj) {
        return obj == this || obj instanceof AnalyzeResult
                && Objects.equals(srcMatches, ((AnalyzeResult) obj).srcMatches)
                && Objects.equals(testMatches, ((AnalyzeResult) obj).testMatches);
    }

    @Override
    public String toString() {
// Path: src/main/java/de/skuzzle/enforcer/restrictimports/util/StringRepresentation.java
// public final class StringRepresentation {
// 
//     private final String name;
//     private final List<Attribute> attributes = new ArrayList<>();
// 
//     private StringRepresentation(String name) {
//         this.name = name;
//     }
// 
//     public static StringRepresentation ofType(Class<?> type) {
//         return new StringRepresentation(type.getSimpleName());
//     }
// 
//     public static StringRepresentation ofInstance(Object instance) {
//         return ofType(instance.getClass());
//     }
// 
//     public StringRepresentation add(String attribute, Object value) {
//         attributes.add(new Attribute(attribute, value));
//         return this;
//     }
// 
//     @Override
//     public String toString() {
//         return new StringBuilder(name)
//                 .append("{")
//                 .append(attributes.stream().map(Attribute::toString).collect(Collectors.joining(", ")))
//                 .append("}")
//                 .toString();
//     }
// 
//     private static final class Attribute {
//         private final String name;
//         private final Object value;
// 
//         private Attribute(String name, Object value) {
//             this.name = name;
//             this.value = value;
//         }
// 
//         @Override
//         public String toString() {
//             return name + "=" + value;
//         }
//     }
// }


// Path: src/main/java/de/skuzzle/enforcer/restrictimports/analyze/AnalyzeResult.java
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import de.skuzzle.enforcer.restrictimports.util.StringRepresentation;

     *
     * @return Analysis duration in ms.
     */
    public Duration duration() {
        return this.duration;
    }

    /**
     * The number of files that have been analysed.
     *
     * @return Number of files.
     */
    public int analysedFiles() {
        return this.analysedFiles;
    }

    @Override
    public int hashCode() {
        return Objects.hash(srcMatches, testMatches);
    }

    @Override
    public boolean equals(Object obj) {
        return obj == this || obj instanceof AnalyzeResult
                && Objects.equals(srcMatches, ((AnalyzeResult) obj).srcMatches)
                && Objects.equals(testMatches, ((AnalyzeResult) obj).testMatches);
    }

    @Override
    public String toString() {
        return StringRepresentation.ofInstance(this)