cargo_tangle/command/list/
requests.rs

1use color_eyre::Result;
2use dialoguer::console::style;
3use blueprint_clients::tangle::client::OnlineClient;
4use tangle_subxt::subxt::utils::AccountId32;
5use tangle_subxt::tangle_testnet_runtime::api::runtime_types::tangle_primitives::services::service::ServiceRequest;
6
7/// Lists all service requests from the Tangle Network.
8///
9/// # Arguments
10///
11/// * `ws_rpc_url` - WebSocket RPC URL for the Tangle Network
12///
13/// # Returns
14///
15/// A vector of tuples containing request IDs and service requests.
16///
17/// # Errors
18///
19/// Returns an error if:
20/// * Failed to connect to the Tangle Network
21/// * Failed to query storage
22/// * Failed to parse storage data
23///
24/// # Panics
25///
26/// Panics if the key bytes cannot be converted to a request ID.
27pub async fn list_requests(
28    ws_rpc_url: String,
29) -> Result<Vec<(u64, ServiceRequest<AccountId32, u64, u128>)>> {
30    let client = OnlineClient::from_url(ws_rpc_url.clone()).await?;
31
32    let service_requests_addr = tangle_subxt::tangle_testnet_runtime::api::storage()
33        .services()
34        .service_requests_iter();
35
36    println!("{}", style("Fetching service requests...").cyan());
37    let mut storage_query = client
38        .storage()
39        .at_latest()
40        .await?
41        .iter(service_requests_addr)
42        .await?;
43
44    let mut requests = Vec::new();
45
46    while let Some(result) = storage_query.next().await {
47        let result = result?;
48        let request = result.value;
49        let id = u64::from_le_bytes(
50            result.key_bytes[32..]
51                .try_into()
52                .expect("Invalid key bytes format"),
53        );
54        requests.push((id, request));
55    }
56
57    println!(
58        "{}",
59        style(format!("Found {} service requests", requests.len())).green()
60    );
61    Ok(requests)
62}
63
64/// Prints the given list of service requests with their details.
65///
66/// # Arguments
67///
68/// * `requests` - A vector of tuples containing request IDs and service requests.
69pub fn print_requests(requests: Vec<(u64, ServiceRequest<AccountId32, u64, u128>)>) {
70    if requests.is_empty() {
71        println!("{}", style("No service requests found").yellow());
72        return;
73    }
74
75    println!("\n{}", style("Service Requests").cyan().bold());
76    println!(
77        "{}",
78        style("=============================================").dim()
79    );
80
81    for (request_id, request) in requests {
82        println!(
83            "{}: {}",
84            style("Request ID").green().bold(),
85            style(request_id).green()
86        );
87        println!("{}: {}", style("Blueprint ID").green(), request.blueprint);
88        println!("{}: {}", style("Owner").green(), request.owner);
89        println!(
90            "{}: {:?}",
91            style("Permitted Callers").green(),
92            request.permitted_callers
93        );
94        println!(
95            "{}: {:?}",
96            style("Security Requirements").green(),
97            request.security_requirements
98        );
99        println!(
100            "{}: {:?}",
101            style("Membership Model").green(),
102            request.membership_model
103        );
104        println!("{}: {:?}", style("Request Arguments").green(), request.args);
105        println!("{}: {:?}", style("TTL").green(), request.ttl);
106        println!(
107            "{}",
108            style("=============================================").dim()
109        );
110    }
111}