You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: list.rs
    path of file: ./repos/ockam/implementations/rust/ockam/ockam_command/src/node
    
    the code of the file until where you have to start completion: use clap::Args;
use colorful::Colorful;
use indoc::formatdoc;
use miette::IntoDiagnostic;
use serde::Serialize;
use tokio::sync::Mutex;
use tokio::try_join;

use ockam_api::cli_state::nodes::NodeInfo;
use ockam_api::NodeProcessStatus;

use crate::output::Output;
use crate::terminal::OckamColor;
use crate::util::async_cmd;
use crate::{docs, CommandGlobalOpts, Result};

const LONG_ABOUT: &str = include_str!("./static/list/long_about.txt");
const PREVIEW_TAG: &str = include_str!("../static/previe
    
    async fn async_run(&self, opts: CommandGlobalOpts) -> miette::Result<()> {
        // Before printing node states we verify them.
        // We send a QueryStatus request to every node on
        // record. If the response yields a different pid to the
        // one in config, we update the pid stored in the config.
        // This should only happen if the node has failed in the past,
        // and has been restarted by something that is not this CLI.
        let node_names: Vec<_> = {
            let nodes = opts.state.get_nodes().await?;
            nodes.iter().map(|n| n.name()).collect()
        };

        let nodes = get_nodes_info(&opts, node_names).await?;
        print_nodes_info(&opts, nodes)?;
        Ok(())
    }