|
|
|
|
|
|
|
|
import sys |
|
|
import json |
|
|
import argparse |
|
|
from pprint import pformat |
|
|
|
|
|
import jmespath |
|
|
from jmespath import exceptions |
|
|
|
|
|
|
|
|
def main(): |
|
|
parser = argparse.ArgumentParser() |
|
|
parser.add_argument('expression') |
|
|
parser.add_argument('-f', '--filename', |
|
|
help=('The filename containing the input data. ' |
|
|
'If a filename is not given then data is ' |
|
|
'read from stdin.')) |
|
|
parser.add_argument('--ast', action='store_true', |
|
|
help=('Pretty print the AST, do not search the data.')) |
|
|
args = parser.parse_args() |
|
|
expression = args.expression |
|
|
if args.ast: |
|
|
|
|
|
expression = jmespath.compile(args.expression) |
|
|
sys.stdout.write(pformat(expression.parsed)) |
|
|
sys.stdout.write('\n') |
|
|
return 0 |
|
|
if args.filename: |
|
|
with open(args.filename, 'r') as f: |
|
|
data = json.load(f) |
|
|
else: |
|
|
data = sys.stdin.read() |
|
|
data = json.loads(data) |
|
|
try: |
|
|
sys.stdout.write(json.dumps( |
|
|
jmespath.search(expression, data), indent=4, ensure_ascii=False)) |
|
|
sys.stdout.write('\n') |
|
|
except exceptions.ArityError as e: |
|
|
sys.stderr.write("invalid-arity: %s\n" % e) |
|
|
return 1 |
|
|
except exceptions.JMESPathTypeError as e: |
|
|
sys.stderr.write("invalid-type: %s\n" % e) |
|
|
return 1 |
|
|
except exceptions.UnknownFunctionError as e: |
|
|
sys.stderr.write("unknown-function: %s\n" % e) |
|
|
return 1 |
|
|
except exceptions.ParseError as e: |
|
|
sys.stderr.write("syntax-error: %s\n" % e) |
|
|
return 1 |
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
sys.exit(main()) |
|
|
|