#compdef lw
# zsh completion for lw. Generated by make completion from lw's own tables: edit cmd/lw, not this file.

local -a described
case ${words[2]}:$CURRENT in
auth:2) ;;
auth:3)
	described=(
		'add-user:Add a user to a credentials file, or replace its password'
		'remove-user:Remove a user from a credentials file'
		'token:Log in to an http sink or http_chain source and print a bearer token'
		'stream:Log in to a tcp sink and copy its stream to stdout until interrupted'
	)
	_describe -t commands 'lw auth command' described
	return ;;
auth:*)
	shift 2 words
	(( CURRENT -= 2 ))
	case ${words[1]} in
	add-user) _arguments -S \
		'--credentials=[credentials file, created when missing]:value:_default' \
		'--generate[generate a new password, replacing any --password-file; needed to rotate without one]' \
		'--password-file=[read the password from file when it exists, else write a generated one there]:value:_default' \
		'(-u --user)'{-u=,--user=}'[user name]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	remove-user) _arguments -S \
		'--credentials=[credentials file]:value:_default' \
		'(-u --user)'{-u=,--user=}'[user name]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	token) _arguments -S \
		'--ca-file=[CA file that verifies the server (default: system roots)]:value:_default' \
		'--cert-file=[client certificate file, for listeners with tls.client_auth]:value:_default' \
		'--key-file=[client key file]:value:_default' \
		'--password-file=[file holding the password; a terminal asks]:value:_default' \
		'--pin-sha256=[sha256//BASE64 pin of the server key, in place of --ca-file (a self_signed listener logs it)]:value:_default' \
		'--server-name=[name the server certificate must carry (default: the host)]:value:_default' \
		'--unbound[log in without channel binding, to an http sink behind a TLS-terminating proxy (auth.trusted_proxies)]' \
		'--url=[listener URL, https://HOST:PORT or https://[IPV6\]:PORT (with --unbound, a proxy'\''s mount URL may carry a path)]:value:_default' \
		'(-u --user)'{-u=,--user=}'[user name]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	stream) _arguments -S \
		'--addr=[tcp sink address, HOST:PORT or [IPV6\]:PORT]:value:_default' \
		'--ca-file=[CA file that verifies the server (default: system roots)]:value:_default' \
		'--cert-file=[client certificate file, for listeners with tls.client_auth]:value:_default' \
		'--key-file=[client key file]:value:_default' \
		'--password-file=[file holding the password; a terminal asks]:value:_default' \
		'--pin-sha256=[sha256//BASE64 pin of the server key, in place of --ca-file (a self_signed listener logs it)]:value:_default' \
		'--server-name=[name the server certificate must carry (default: the host)]:value:_default' \
		'(-u --user)'{-u=,--user=}'[user name]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	esac
	return ;;
tls:2) ;;
tls:3)
	described=(
		'ca:Create a certificate authority, DIR/ca.crt and DIR/ca.key, that signs certificates only'
		'cert:Issue a certificate and key, OUT/NAME.crt and OUT/NAME.key, from DIR/ca.crt and DIR/ca.key'
	)
	_describe -t commands 'lw tls command' described
	return ;;
tls:*)
	shift 2 words
	(( CURRENT -= 2 ))
	case ${words[1]} in
	ca) _arguments -S \
		'--days=[validity in n days]:value:_default' \
		'--dir=[directory to write ca.crt and ca.key in, created when missing]:directory:_files -/' \
		'--name=[subject common name]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	cert) _arguments -S \
		'--ca-dir=[directory holding ca.crt and ca.key (lw tls ca)]:directory:_files -/' \
		'--client[for dialers presenting a certificate (TLS client authentication)]' \
		'--days=[validity in n days, at most the CA'\''s]:value:_default' \
		'--hosts=[DNS names and IP addresses, '\'','\'' between them (default with --server: --name)]:value:_default' \
		'--name=[subject common name, the mtls identity, and the file names]:value:_default' \
		'--out=[directory to write in (default: --ca-dir)]:directory:_files -/' \
		'--server[for listeners (TLS server authentication)]' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	esac
	return ;;
preset:2) ;;
preset:3)
	described=(
		'pipe:Standard input to standard output, line for line: lw without a file'
		'tail:Follow files to standard output, like tail -F'
		'serve:Serve files or standard input live: a browser viewer at /, SSE at /stream'
		'edge:Forward files or standard input to an aggregator over TLS, authenticated'
		'aggregator:Receive from edges over TLS, authenticated, to files or standard output'
	)
	_describe -t commands 'lw preset command' described
	return ;;
preset:*)
	shift 2 words
	(( CURRENT -= 2 ))
	case ${words[1]} in
	pipe) _arguments -S \
		'--format=[raw|txt|json: raw writes each message as it came, txt a line with time and level, json one object an entry]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	tail) _arguments -S \
		'--format=[raw|txt|json: raw writes each message as it came, txt a line with time and level, json one object an entry]:value:_default' \
		'--from=[start|end: where reading a file starts]:value:_default' \
		'--path=[a file, a directory (its files) or a glob such as /var/log/*.log, to follow]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	serve) _arguments -S \
		'--allow=[addresses or CIDRs that may connect, of listen'\''s family (either behind proxy=); default: all; '\'','\'' between them]:value:_default' \
		'--cert=[certificate file, for tls=files]:value:_default' \
		'--deny=[addresses or CIDRs refused, allow or not; '\'','\'' between them]:value:_default' \
		'--format=[raw|txt|json: raw writes each message as it came, txt a line with time and level, json one object an entry]:value:_default' \
		'--from=[start|end: where reading a file starts]:value:_default' \
		'--hosts=[names and addresses, beyond this host'\''s, of a self or issuer certificate; '\'','\'' between them]:value:_default' \
		'--issuer_cert=[CA certificate file (lw tls ca), for tls=issuer]:value:_default' \
		'--issuer_key=[CA key file, for tls=issuer]:value:_default' \
		'--key=[key file, for tls=files]:value:_default' \
		'--listen=[HOST:PORT to listen on: 127.0.0.1:8080 this machine only, 0.0.0.0:8080 every IPv4 interface, [::\]:8080 every IPv6 interface]:value:_default' \
		'--password_file=[file holding user'\''s password; /dev/fd/N or a pipe is read once; default: /dev/tty, which asks]:value:_default' \
		'--path=[a file, a directory (its files) or a glob such as /var/log/*.log, to follow; default: standard input]:value:_default' \
		'--proxy=[addresses or CIDRs of the TLS-terminating proxies browsers come through; '\'','\'' between them]:value:_default' \
		'--tls=[off|self|issuer|files: plain text, a certificate made at startup (self-signed, or from issuer_*), or files]:value:_default' \
		'(-u --user)'{-u=,--user=}'[the one SCRAM user readers log in as, in place of users]:value:_default' \
		'--users=[credentials file (lw auth add-user): readers log in with SCRAM]:value:_default' \
		'--viewer=[true|false: a login page, then the viewer, for browsers behind proxy; without user or users the viewer is on anyway]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	edge) _arguments -S \
		'--ca=[CA file that verifies the aggregator; default: system roots]:value:_default' \
		'--cert=[client certificate file, for an aggregator with client_ca]:value:_default' \
		'--from=[start|end: where reading a file starts]:value:_default' \
		'--key=[client key file]:value:_default' \
		'--node=[origin label; default: this host'\''s name]:value:_default' \
		'--password_file=[file holding user'\''s password; /dev/fd/N or a pipe is read once; default: /dev/tty, which asks]:value:_default' \
		'--path=[a file, a directory (its files) or a glob such as /var/log/*.log, to follow; default: standard input]:value:_default' \
		'--pin=[sha256//BASE64 of the aggregator'\''s key, which it logs with tls=self]:value:_default' \
		'--server_name=[name the aggregator'\''s certificate carries; default: to'\''s host]:value:_default' \
		'--to=[the aggregator'\''s HOST:PORT, an IPv6 address in brackets: logs.example.net:9000, [2001:db8::1\]:9000]:value:_default' \
		'--transport=[tcp|http: tcp sends over one lasting connection (tcp_chain), http posts batches (http_chain)]:value:_default' \
		'(-u --user)'{-u=,--user=}'[SCRAM user this edge logs in to the aggregator as]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	aggregator) _arguments -S \
		'--allow=[addresses or CIDRs that may connect, of listen'\''s family (either behind proxy=); default: all; '\'','\'' between them]:value:_default' \
		'--cert=[certificate file, for tls=files]:value:_default' \
		'--client_ca=[CA file that verifies edge certificates (mTLS)]:value:_default' \
		'--deny=[addresses or CIDRs refused, allow or not; '\'','\'' between them]:value:_default' \
		'--format=[raw|txt|json: raw writes each message as it came, txt a line with time and level, json one object an entry]:value:_default' \
		'--hosts=[names and addresses, beyond this host'\''s, of a self or issuer certificate; '\'','\'' between them]:value:_default' \
		'--issuer_cert=[CA certificate file (lw tls ca), for tls=issuer]:value:_default' \
		'--issuer_key=[CA key file, for tls=issuer]:value:_default' \
		'--key=[key file, for tls=files]:value:_default' \
		'--listen=[HOST:PORT to listen on: 0.0.0.0:9000 every IPv4 interface, [::\]:9000 every IPv6 interface, 127.0.0.1:9000 this machine only]:value:_default' \
		'--out=[directory for the received entries; default: standard output]:value:_default' \
		'--password_file=[file holding user'\''s password; /dev/fd/N or a pipe is read once; default: /dev/tty, which asks]:value:_default' \
		'--tls=[self|issuer|files: a certificate made at startup (self-signed, or from issuer_*), or files]:value:_default' \
		'--transport=[tcp|http: tcp sends over one lasting connection (tcp_chain), http posts batches (http_chain)]:value:_default' \
		'(-u --user)'{-u=,--user=}'[the one SCRAM user edges log in as, in place of users]:value:_default' \
		'--users=[credentials file (lw auth add-user): edges log in with SCRAM]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	esac
	return ;;
config:2) ;;
config:3)
	described=(
		'init:Write the annotated default configuration, to edit and run'
	)
	_describe -t commands 'lw config command' described
	return ;;
config:*)
	shift 2 words
	(( CURRENT -= 2 ))
	case ${words[1]} in
	init) _arguments -S \
		'--out=[file to write (default: ~/.config/logwisp/logwisp.toml)]:value:_default' \
		'(-h --help)'{-h,--help}'[print the flags]' ;;
	esac
	return ;;
esac
if (( CURRENT == 2 )) && [[ $PREFIX != -* ]]; then
	described=(
		'auth:SCRAM users, bearer tokens, tcp sink viewing'
		'tls:A CA and certificates for TLS and mTLS'
		'preset:Show the pipeline a preset makes, as TOML'
		'config:Place the annotated default configuration'
		'help:Print the help and exit'
	)
	_describe -t commands 'lw command' described
	return
fi
_arguments -S \
	'--auto_reload' \
	'(-t --check)'{-t,--check} \
	'--color' \
	'(-c --config)'{-c=,--config=}':value:_default' \
	'--dump' \
	'*--filter=:value:_default' \
	'*--format=:value:_default' \
	'*--heartbeat=:value:_default' \
	'(-h --help)'{-h,--help} \
	'--logging.console.target=:value:_default' \
	'--logging.file.directory=:directory:_files -/' \
	'--logging.file.max_size_mb=:value:_default' \
	'--logging.file.max_total_size_mb=:value:_default' \
	'--logging.file.name=:value:_default' \
	'--logging.file.retention_hours=:value:_default' \
	'--logging.format=:value:_default' \
	'--logging.level=:value:_default' \
	'--logging.output=:value:_default' \
	'--logging.sanitization=:value:_default' \
	'*--pipeline=:value:_default' \
	'*'{-p=,--preset=}':preset:(pipe tail serve edge aggregator)' \
	'(-q --quiet)'{-q,--quiet} \
	'*--rate-limit=:value:_default' \
	'--schema' \
	'*--sink=:value:_default' \
	'*--source=:value:_default' \
	'--status_reporter' \
	'(-T --tui)'{-T,--tui} \
	'(-V --version)'{-V,--version}
