def METHOD_NAME(entry, table_filter, tables_format_rules):
    public_transaction = entry.get_public_domain()
    public_tables = public_transaction.get_tables()
    flags = entry.get_transaction_header().flags
    flags_msg = "" if flags == 0 else f", flags={hex(flags)}"
    tx_header = f"{indent(2)}txid {entry.get_txid()} ({counted_string(public_tables, 'public table')}) [{entry.get_len()} bytes{flags_msg}]"
    printed_tx_header = False
    private_table_size = entry.get_private_domain_size()
    if private_table_size and table_filter is None:
        if not printed_tx_header:
            LOG.success(tx_header)
            printed_tx_header = True
        LOG.error(f"{indent(2)}-- private: {private_table_size} bytes")
    for table_name, records in public_tables.items():
        if table_filter is not None and not table_filter.match(table_name):
            continue
        if not printed_tx_header:
            LOG.success(tx_header)
            printed_tx_header = True
        LOG.warning(
            f'{indent(4)}table "{table_name}" ({counted_string(records, "write")}):'
        )
        key_indent = indent(6)
        value_indent = indent(8)
        for key, value in records.items():
            if value is not None:
                try:
                    value = find_rule(tables_format_rules, table_name)["value"](value)
                    value = value.replace(
                        "\n", f"\n{value_indent}"
                    )  # Indent every line within stringified JSON
                except (json.decoder.JSONDecodeError, UnicodeDecodeError):
                    pass
                finally:
                    print_key(key, table_name, tables_format_rules, key_indent)
                    LOG.info(f"{value_indent}{value}")
            else:
                print_key(
                    key, table_name, tables_format_rules, key_indent, is_removed=True
                )