101 lines
2.8 KiB
Python
101 lines
2.8 KiB
Python
|
#!/usr/bin/env python3
|
||
|
#
|
||
|
# BSD 3-Clause License
|
||
|
#
|
||
|
# This file is part of the Basalt project.
|
||
|
# https://gitlab.com/VladyslavUsenko/basalt.git
|
||
|
#
|
||
|
# Copyright (c) 2019-2021, Vladyslav Usenko and Nikolaus Demmel.
|
||
|
# All rights reserved.
|
||
|
#
|
||
|
|
||
|
#
|
||
|
# Example usage:
|
||
|
# $ ./query-config.py path/to/basalt_config.json value0.\"config.vio_debug\"
|
||
|
# 10G
|
||
|
|
||
|
import json
|
||
|
import toml
|
||
|
import argparse
|
||
|
import sys
|
||
|
|
||
|
|
||
|
def parse_query(query):
|
||
|
query_list = []
|
||
|
|
||
|
quote_open_char = None
|
||
|
curr = ""
|
||
|
for c in query:
|
||
|
if quote_open_char:
|
||
|
if c == quote_open_char:
|
||
|
quote_open_char = None
|
||
|
else:
|
||
|
curr += c
|
||
|
elif c in ['"', "'"]:
|
||
|
quote_open_char = c
|
||
|
elif c == '.':
|
||
|
query_list.append(curr)
|
||
|
curr = ""
|
||
|
else:
|
||
|
curr += c
|
||
|
query_list.append(curr)
|
||
|
|
||
|
return query_list
|
||
|
|
||
|
|
||
|
def query_config(path, query, default_value=None, format_env=False, format_cli=False):
|
||
|
query_list = parse_query(query)
|
||
|
with open(path) as f:
|
||
|
cfg = json.load(f)
|
||
|
try:
|
||
|
curr = cfg
|
||
|
for q in query_list:
|
||
|
curr = curr[q]
|
||
|
result = curr
|
||
|
except:
|
||
|
if default_value is None:
|
||
|
result = ""
|
||
|
else:
|
||
|
result = default_value
|
||
|
if isinstance(result, dict):
|
||
|
if format_env:
|
||
|
lines = []
|
||
|
for k, v in result.items():
|
||
|
# NOTE: assumes no special escaping is necessary
|
||
|
lines.append("{}='{}'".format(k, v))
|
||
|
return "\n".join(lines)
|
||
|
elif format_cli:
|
||
|
args = ["--{} {}".format(k, v) for k, v in result.items()]
|
||
|
return " ".join(args)
|
||
|
else:
|
||
|
result = toml.dumps(result)
|
||
|
else:
|
||
|
result = "{}".format(result)
|
||
|
return result
|
||
|
|
||
|
|
||
|
def main():
|
||
|
parser = argparse.ArgumentParser("Parse toml file and print content of query key.")
|
||
|
parser.add_argument("config_path", help="path to toml file")
|
||
|
parser.add_argument("query", help="query string")
|
||
|
parser.add_argument("default_value", help="value printed if query is not successful", nargs='?')
|
||
|
parser.add_argument(
|
||
|
"--format-env",
|
||
|
action="store_true",
|
||
|
help="Expect dictionary as query result and output like environment variables, i.e. VAR='VALUE' lines.")
|
||
|
parser.add_argument("--format-cli",
|
||
|
action="store_true",
|
||
|
help="Expect dictionary as query result and output like cli arguments, i.e. --VAR 'VALUE'.")
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
res = query_config(args.config_path,
|
||
|
args.query,
|
||
|
default_value=args.default_value,
|
||
|
format_env=args.format_env,
|
||
|
format_cli=args.format_cli)
|
||
|
print(res)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|