#!/usr/bin/env python3
"""
Python library for BER-TLV en-/decoding.
Versioning scheme: https://semver.org/spec/v2.0.0.html
"""
from typing import BinaryIO, Optional, Union
from . import config, generator, parser
from .tree import Tree
__version__ = "0.7.0"
__author__ = "Philip Schömig"
[docs]def tree_from_binary(source: Union[bytes, BinaryIO]) -> Tree:
    """Parse a TLV tree from binary data and return the resulting `Tree`."""
    parser_instance = parser.BinaryParser()
    try:
        return parser.parse_bytes(source, parser_instance)
    except TypeError:
        return parser.parse(source, parser_instance) 
[docs]def tree_from_xml(source: Union[bytes, BinaryIO]) -> Tree:
    """Parse a TLV tree from XML data and return the resulting `Tree`."""
    parser_instance = parser.XmlParser()
    try:
        return parser.parse_bytes(source, parser_instance)
    except TypeError:
        return parser.parse(source, parser_instance) 
[docs]def tree_to_binary(source: Tree, file: BinaryIO = None) -> Optional[bytes]:
    """Generate binary data of a TLV tree and return it or write it to *file*.
    If *file* is ``None`` return the `bytes` otherwise write data to *file*.
    """
    generator_instance = generator.BinaryGenerator()
    if file:
        generator.generate(file, source, generator_instance)
        return None
    return generator.generate_bytes(source, generator_instance) 
[docs]def tree_to_text(source: Tree, file: BinaryIO = None) -> Optional[bytes]:
    """Generate a text dump of a TLV tree and return it or write it to *file*.
    If *file* is ``None`` return the `bytes` otherwise write data to *file*.
    """
    data = source.dump().encode(config.encoding)
    if file:
        file.write(data)
        return None
    return data 
[docs]def tree_to_xml(source: Tree, file: BinaryIO = None) -> Optional[bytes]:
    """Generate XML data of a TLV tree and return it or write it to *file*.
    If *file* is ``None`` return the `bytes` otherwise write data to *file*.
    """
    generator_instance = generator.XmlGenerator()
    if file:
        generator.generate(file, source, generator_instance)
        return None
    return generator.generate_bytes(source, generator_instance)