/*
 * Copyright (C) 2016 The Dagger Authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package dagger.grpc.server;

import dagger.Module;
import dagger.Provides;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.netty.NettyServerBuilder;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import javax.inject.Singleton;

/**
 * Installing this module into a {@link Singleton @Singleton} component means the component can
 * provide a {@linkplain NettyServerBuilder Netty}-based {@link Server}.
 */
@Module(includes = ServerModule.class)
public final class NettyServerModule {

  private final SocketAddress socketAddress;

  private NettyServerModule(SocketAddress socketAddress) {
    this.socketAddress = socketAddress;
  }

  /**
   * A module that binds to {@code port} on the wildcard address.
   */
  public static NettyServerModule bindingToPort(int port) {
    return new NettyServerModule(new InetSocketAddress(port));
  }

  /**
   * A module that binds to {@code socketAddress}.
   */
  public static NettyServerModule bindingTo(SocketAddress socketAddress) {
    return new NettyServerModule(socketAddress);
  }

  @Provides
  ServerBuilder<?> serverBuilder() {
    return NettyServerBuilder.forAddress(socketAddress);
  }
}
