<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def get_wallet_record(wallet_handle: int, type_: str, id: str, options_json: str) -> str: """ Get an wallet record by id :param wallet_handle: wallet handler (created by open_wallet). :param type_: allows to separate different record types collections :param id: the id of record :param options_json: //TODO: FIXME: Think about replacing by bitmask { retrieveType: (optional, false by default) Retrieve record type, retrieveValue: (optional, true by default) Retrieve record value, retrieveTags: (optional, true by default) Retrieve record tags } :return: wallet record json: { id: "Some id", type: "Some type", // present only if retrieveType set to true value: "Some value", // present only if retrieveValue set to true tags: <tags json>, // present only if retrieveTags set to true } """


    logger = logging.getLogger(__name__)
    logger.debug("get_wallet_record: >>> wallet_handle: %r, type_: %r, id: %r, options_json: %r",
                 wallet_handle,
                 type_,
                 id,
                 options_json)

    if not hasattr(get_wallet_record, "cb"):
        logger.debug("get_wallet_record: Creating callback")
        get_wallet_record.cb = create_cb(CFUNCTYPE(None, c_int32, c_int32, c_char_p))

    c_wallet_handle = c_int32(wallet_handle)
    c_type = c_char_p(type_.encode('utf-8'))
    c_id = c_char_p(id.encode('utf-8'))
    c_options_json = c_char_p(options_json.encode('utf-8'))

    wallet_record = await do_call('indy_get_wallet_record',
                                  c_wallet_handle,
                                  c_type,
                                  c_id,
                                  c_options_json,
                                  get_wallet_record.cb)
    res = wallet_record.decode()

    logger.debug("get_wallet_record: <<< res: %r", res)
    return res