class RepositoryParamValidator {
    private final Map<String, TypeSettings> typeSettings;

    @Inject
    public RepositoryParamValidator(Map<String, TypeSettings> repositoryTypeSettings) {
        typeSettings = repositoryTypeSettings;
    }

    public void validate(String type, GenericProperties<?> genericProperties, Settings settings) {<FILL_FUNCTION_BODY>}

    public TypeSettings settingsForType(String type) {
        TypeSettings typeSettings = this.typeSettings.get(type);
        if (typeSettings == null) {
            throw new IllegalArgumentException(String.format(Locale.ENGLISH, "Invalid repository type \"%s\"", type));
        }

        return typeSettings;
    }
}

        TypeSettings typeSettings = settingsForType(type);
        Map<String, Setting<?>> allSettings = typeSettings.all();

        // create string settings for all dynamic settings
        GenericProperties<?> dynamicProperties = typeSettings.dynamicProperties(genericProperties);
        if (!dynamicProperties.isEmpty()) {
            // allSettings are immutable by default, copy map
            allSettings = new HashMap<>(allSettings);
            for (String key : dynamicProperties.properties().keySet()) {
                allSettings.put(key, Setting.simpleString(key));
            }
        }

        // validate all settings
        Set<String> names = settings.keySet();
        Set<String> missingRequiredSettings = Sets.difference(typeSettings.required().keySet(), names);
        if (!missingRequiredSettings.isEmpty()) {
            throw new IllegalArgumentException(
                String.format(
                    Locale.ENGLISH,
                    "The following required parameters are missing to create a repository of type \"%s\": [%s]",
                    type,
                    String.join(", ", missingRequiredSettings))
            );
        }
    
<no_super_class>