package com.hubspot.singularity.runner.base.config;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import com.google.common.base.Optional;
import com.google.inject.Binder;
import com.google.inject.Scopes;
import com.google.inject.multibindings.Multibinder;
import com.hubspot.singularity.runner.base.configuration.BaseRunnerConfiguration;
import com.hubspot.singularity.runner.base.configuration.Configuration;
public class ConfigurationBinder {
private final Binder binder;
private final Multibinder<BaseRunnerConfiguration> multibinder;
public static <T extends BaseRunnerConfiguration> ConfigurationBinder newBinder(Binder binder) {
return new ConfigurationBinder(binder);
}
private ConfigurationBinder(Binder binder) {
this.binder = binder;
this.multibinder = Multibinder.newSetBinder(binder, BaseRunnerConfiguration.class);
}
public <T extends BaseRunnerConfiguration> ConfigurationBinder bindPrimaryConfiguration(Class<T> configurationClass, Optional<String> filename) {
bindConfiguration(configurationClass, filename);
binder.bind(BaseRunnerConfiguration.class).to(configurationClass);
return this;
}
public <T extends BaseRunnerConfiguration> ConfigurationBinder bindConfiguration(Class<T> configurationClass, Optional<String> filename) {
checkNotNull(configurationClass, "configurationClass");
checkState(configurationClass.getAnnotation(Configuration.class) != null, "%s must be annotated with @Configuration", configurationClass.getSimpleName());
binder.bind(configurationClass).toProvider(new SingularityRunnerConfigurationProvider<T>(configurationClass, filename)).in(Scopes.SINGLETON);
multibinder.addBinding().to(configurationClass);
return this;
}
}