#!/usr/bin/env python3

r"""
VPD functions.
"""

import json
import func_args as fa
import bmc_ssh_utils as bsu


def vpdtool(option_string, **bsu_options):
    r"""
    Run vpdtool on the BMC with the caller's option string and return the result.

    Example:

    ${vpd_results}=  vpd-tool -i
    Rprint Vars  vpd_results

    vpd_results:
      [/system/chassis/motherboard]:
        [PN]:                PN12345
        [SN]:                YL2E2D010000
        [LocationCode]:      U78DA.ND1.       -P0
        [CC]:                2E2D
        [DR]:                SYSTEM BACKPLANE
        [FN]:                F191014
        [type]:              xyz.openbmc_project.Inventory.Item.Board.Motherboard
      [/system/chassis/motherboard/ebmc_card_bmc]:
        [PN]:                PN12345
        [SN]:                YL6B58010000
        [LocationCode]:      U78DA.ND1.       -P0-C5
        [CC]:                6B58
        [DR]:                EBMC
        [FN]:                F191014
        [type]:              xyz.openbmc_project.Inventory.Item.Bmc

    Description of argument(s):
    option_string            A string of options which are to be processed by
                             the vpd-tool command.
    bsu_options              Options to be passed directly to bmc_execute_command.
                             See its prolog for details.
    """

    bsu_options = fa.args_to_objects(bsu_options)
    out_buf, stderr, rc = bsu.bmc_execute_command('vpd-tool ' + option_string, **bsu_options)

    # Only return output if its not a VPD write command.
    if '-w' not in option_string:
        out_buf = json.loads(out_buf)
        if '-r' in option_string:
            return out_buf
        else:
            return out_buf[0]
