# HG changeset patch # User Goffi # Date 1756636477 -7200 # Node ID e28cd3454c607b192f205b988251ff296eee84dc # Parent 49aa73c8fc304eb080ae30903c767f4d37385668 cli (pubsub): List support first draft + doc: Basic support for listing hierarchy of nodes with pubsub extended discovery. Nodes are displayed as a tree, depth can be specified. rel 463 diff -r 49aa73c8fc30 -r e28cd3454c60 doc/libervia-cli/pubsub.rst --- a/doc/libervia-cli/pubsub.rst Sun Aug 31 12:34:37 2025 +0200 +++ b/doc/libervia-cli/pubsub.rst Sun Aug 31 12:34:37 2025 +0200 @@ -117,6 +117,32 @@ $ li pubsub rename -n some_node -i 123 456 +.. _li_pubsub_list: + +list +==== + +List PubSub nodes and items. + +By default, this command will display a tree view of the nodes and items available on the +specified service. + +.. note:: + + The current implementation provides a basic tree view of nodes. Future versions will + include enhanced formatting options and additional filtering capabilities. + +example +------- + +List all nodes and items on a pubsub service:: + + $ li pubsub list -s pubsub.example.net + +List nodes and items for a specific node:: + + $ li pubsub list -s pubsub.example.net -n some_node + subscribe ========= diff -r 49aa73c8fc30 -r e28cd3454c60 libervia/cli/cmd_pubsub.py --- a/libervia/cli/cmd_pubsub.py Sun Aug 31 12:34:37 2025 +0200 +++ b/libervia/cli/cmd_pubsub.py Sun Aug 31 12:34:37 2025 +0200 @@ -26,6 +26,7 @@ import asyncio import json from . import base +from rich.tree import Tree from libervia.backend.core.i18n import _ from libervia.backend.core import exceptions from libervia.cli.constants import Const as C @@ -1566,6 +1567,63 @@ self.host.quit(C.EXIT_OK) +class List(base.CommandBase): + + def __init__(self, host): + extra_outputs = {"default": self.default_output} + base.CommandBase.__init__( + self, + host, + "list", + use_pubsub=True, + use_output=C.OUTPUT_COMPLEX, + extra_outputs=extra_outputs, + pubsub_flags={}, + help=_("list nodes and items"), + ) + + def add_parser_options(self): + self.parser.add_argument( + "-d", + "--depth", + type=int, + default=0, + help=_("recursion depth level (DEFAULT: 0)"), + ) + + async def start(self): + options = { + "depth": self.args.depth + } + try: + result_s = await self.host.bridge.ps_disco_get( + self.args.service, + self.args.node, + data_format.serialise(options), + self.profile, + ) + except Exception as e: + self.disp(f"Can't list: {e}.", error=True) + self.host.quit(C.EXIT_BRIDGE_ERRBACK) + else: + result = data_format.deserialise(result_s, type_check=list) + await self.output(result) + self.host.quit(C.EXIT_OK) + + def recursive_tree(self, item_data: dict) -> Tree: + node_tree = Tree(item_data["name"]) + children = item_data.get("children", []) + for child in children: + node_tree.add(self.recursive_tree(child)) + return node_tree + + + def default_output(self, data: list) -> None: + """Output the node as a tree view.""" + for item in data: + self.console.print(self.recursive_tree(item)) + + class Subscribe(base.CommandBase): def __init__(self, host): base.CommandBase.__init__( @@ -3064,6 +3122,7 @@ Delete, Edit, Rename, + List, Subscribe, Unsubscribe, Subscriptions,