#!/usr/bin/ruby

DockerBinaryLocation = `which docker`.chomp

def cmd(*args)
  io = IO.popen(args, err: [:child, :out])
  io.read.split("\n")
end

def docker(*args)
  cmd(DockerBinaryLocation, *args).first
end

if ARGV.delete('-p') or ARGV.delete('--ports')
  print = :ports
elsif ARGV.delete('-o') or ARGV.delete('--origins')
  print = :ip_and_port_pairs
else
  print = :connstrings
end

unless container = ARGV[0]
  $stderr.puts "invalid argument"
  Kernel.exit 1
end

ip = docker 'inspect', '--format', '{{.NetworkSettings.IPAddress}}', container
ports_and_transports = docker 'inspect', '--format', '{{range $port, $v := .NetworkSettings.Ports}}{{$port}} {{end}}', container

conns = ports_and_transports.split(' ').map do |port_and_transport|
  port, transport = port_and_transport.split('/')
  port = port.to_i
  {port: port, transport: transport, ip: ip}
end

conns = conns.sort_by{ |conn| [conn[:port], conn[:transport]] }

conns.each do |conn|
  case print
  when :ports
    puts conn[:port]
  when :ip_and_port_pairs
    puts "#{conn[:ip]}:#{conn[:port]}"
  when :connstrings
    puts "#{conn[:transport]}://#{conn[:ip]}:#{conn[:port]}"
  end
end

