blob: 86ff6e2664bdd1ecbe4cd178141a47722b0e452b [file] [log] [blame]
# Copyright 2020 The Pigweed 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
#
# https://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.
"""Defines arguments for the pw command."""
import argparse
import logging
from pathlib import Path
import sys
from typing import NoReturn
from pw_cli import argument_types, plugins
from pw_cli.branding import banner
_HELP_HEADER = '''The Pigweed command line interface (CLI).
Example uses:
pw logdemo
pw --loglevel debug watch out/clang
'''
def parse_args() -> argparse.Namespace:
return _parser().parse_args()
def print_banner() -> None:
"""Prints the PIGWEED (or project specific) banner to stderr."""
print(banner() + '\n', file=sys.stderr)
def format_help(registry: plugins.Registry) -> str:
"""Returns the pw help information as a string."""
return f'{_parser().format_help()}\n{registry.short_help()}'
class _ArgumentParserWithBanner(argparse.ArgumentParser):
"""Parser that the Pigweed banner when there are parsing errors."""
def error(self, message: str) -> NoReturn:
print_banner()
self.print_usage(sys.stderr)
self.exit(2, f'{self.prog}: error: {message}\n')
def _parser() -> argparse.ArgumentParser:
"""Creates an argument parser for the pw command."""
argparser = _ArgumentParserWithBanner(
prog='pw',
add_help=False,
description=_HELP_HEADER,
formatter_class=argparse.RawDescriptionHelpFormatter)
# Do not use the built-in help argument so that displaying the help info can
# be deferred until the pw plugins have been registered.
argparser.add_argument('-h',
'--help',
action='store_true',
help='Display this help message and exit')
argparser.add_argument(
'-C',
'--directory',
type=argument_types.directory,
default=Path.cwd(),
help='Change to this directory before doing anything')
argparser.add_argument(
'-l',
'--loglevel',
type=argument_types.log_level,
default=logging.INFO,
help='Set the log level (debug, info, warning, error, critical)')
argparser.add_argument('--no-banner',
action='store_true',
help='Do not print the Pigweed banner')
argparser.add_argument(
'command',
nargs='?',
help='Which command to run; see supported commands below')
argparser.add_argument(
'plugin_args',
metavar='...',
nargs=argparse.REMAINDER,
help='Remaining arguments are forwarded to the command')
return argparser