#compdef gb
#autoload

_gb () {
	local ret=1 state
	_arguments -C ':command:->command' '*::options:->options' && ret=0

	case $state in
	(command)
		local -a subcommands
		subcommands=(
			"build:build a package"
			"doc:show documentation for a package or symbol"
			"env:print project environment variables"
			"generate:generate Go files by processing source"
			"help:displays the help"
			"info:info returns information about this project"
			"list:list the packages named by the importpaths"
			"test:test packages"
			"vendor:manage your vendored dependencies"
		)
		_describe -t subcommands 'gb subcommands' subcommands && ret=0
		;;
	(options)
		case $line[1] in
		(build)
			_arguments \
				-f'[ignore cached packages]' \
				-F'[do not cache packages]' \
				-q'[decreases verbosity]' \
				-P'[the number of build jobs to run in parallel]' \
				-R'[sets the base of the project root search path]' \
				-dotfile'[output a dot formatted file of the build steps]' \
				-ldflags'["flag list" arguments to pass to the linker]' \
				-gcflags'["arg list" arguments to pass to the compiler]' \
				-race'[enable data race detection]' \
				-tags'["tag list" additional build tags]'
			;;
		(list)
			_arguments \
				-f'[alternate format for the list, using the syntax of package template]' \
				-s'[read format template from STDIN]' \
				-json'[prints output in structured JSON format]'
			;;
		(test)
			_arguments \
				-v'[print output from test subprocess]' \
				-ldflags'["flag list" arguments to pass to the linker]' \
				-gcflags'["arg list" arguments to pass to the compiler]' \
				-race'[enable data race detection]' \
				-tags'["tag list" additional build tags]'
			;;
		(vendor)
			_gb-vendor
		esac
		;;
	esac

	return ret
}

_gb-vendor () {
	local curcontext="$curcontext" state line
	_arguments -C ':command:->command' '*::options:->options'

	case $state in
	(command)
		local -a subcommands
		subcommands=(
			'delete:deletes a local dependency'
			'fetch:fetch a remote dependency'
			'list:lists dependencies, one per line'
			'purge:remove all unreferenced dependencies'
			'restore:restore dependencies from the manifest'
			'update:update a local dependency'
		)
		_describe -t subcommands 'gb vendor subcommands' subcommands && ret=0
		;;
	(options)
		case $line[1] in
			(delete)
				_arguments \
					-all'[remove all dependencies]'
				;;
			(fetch)
				_arguments \
					-branch'[fetch from a particular branch]' \
					-no-recurse'[do not fetch recursively]' \
					-tag'[fetch the specified tag]' \
					-revision'[fetch the specific revision from the branch (if supplied)]' \
					-precaire'[allow the use of insecure protocols]' \
				;;
			(list)
				_arguments \
					-f'[controls the template used for printing each manifest entry]'
				;;
			(restore)
				_arguments \
					-precaire'[allow the use of insecure protocols]'
				;;
			(update)
				_arguments \
					-all'[update all dependencies in the manifest or supply a given dependency]' \
					-precaire'[allow the use of insecure protocols]'
				;;
		esac
		;;
	esac
}

_gb