Source code for scdatatools.cli.commands.cryxml
import json
import sys
import typing
from pathlib import Path
from nubia import command, argument
from scdatatools.engine.cryxml import (
etree_from_cryxml_file,
dict_from_cryxml_file,
is_cryxmlb_file,
)
from scdatatools.engine.cryxml.utils import pprint_xml_tree
def _do_conversions(cryxml_file, replace, output, fmt):
if replace:
output = Path(cryxml_file)
with Path(cryxml_file).open("rb") as cxml:
if is_cryxmlb_file(cxml):
if fmt == "xml":
d = pprint_xml_tree(etree_from_cryxml_file(cxml))
else:
d = json.dumps(dict_from_cryxml_file(cxml), indent=2)
else:
sys.stderr.write(f"{cryxml_file} is not a CryXmlB file\n")
return False
if output == "-":
print(d)
else:
with open(output, "w") as f:
f.write(d)
return True
[docs]@command(help="Convert a CryXML file to xml")
@argument("cryxml_file", description="CryXML to convert", positional=True)
@argument("replace", aliases=["-r"], description="Convert the file in place")
@argument(
"output",
description="Output filename or '-' for stdout. Defaults to '-'. Ignored if --replace is set.",
aliases=["-o"],
)
def cryxml_to_xml(cryxml_file: typing.Text, replace: bool = False, output: typing.Text = "-"):
_do_conversions(cryxml_file, replace, output, "xml")
[docs]@command(help="Convert a CryXML file to JSON")
@argument("cryxml_file", description="CryXML to convert", positional=True)
@argument(
"replace",
aliases=["-r"],
description="Convert the file in place. (will change the extension to .json)",
)
@argument(
"output",
description="Output filename or '-' for stdout. Defaults to '-'",
aliases=["-o"],
)
def cryxml_to_json(cryxml_file: typing.Text, replace: bool = False, output: typing.Text = "-"):
if _do_conversions(cryxml_file, replace, output, "json") and replace:
Path(cryxml_file).unlink(missing_ok=True)