EnumPattern.java

package de.schegge.rosinante.generator;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EnumPattern {
    private final String name;
    private final Map<Integer, EnumFieldPattern> fields = new HashMap<>();

    private boolean allowAlias;

    public EnumPattern(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public List<EnumFieldPattern> getFields() {
        return List.copyOf(fields.values());
    }

    public void addField(EnumFieldPattern pattern) {
        checkForDuplicates(pattern);
        EnumFieldPattern fieldPattern = fields.get(pattern.fieldNumber());
        if (fieldPattern != null) {
            fieldPattern.names().addAll(pattern.names());
        } else {
            fields.put(pattern.fieldNumber(), pattern);
        }
    }

    private void checkForDuplicates(EnumFieldPattern pattern) {
        List<String> existingFieldNames = fields.values().stream().map(EnumFieldPattern::names)
                .flatMap(List::stream).filter(x -> pattern.names().contains(x)).toList();
        if (!existingFieldNames.isEmpty()) {
            throw new IllegalArgumentException("duplicate field name: " + existingFieldNames);
        }
    }

    public void setAllowAlias(Boolean allowAlias) {
        this.allowAlias = allowAlias;
    }

    public boolean isAllowAlias() {
        return allowAlias;
    }
}