account for pagination when listing all servers

This commit is contained in:
Maxime Van Hees 2025-07-15 11:10:14 +02:00
parent a6c102aabf
commit 92e8ac6d16

View File

@ -1,4 +1,4 @@
use hcloud::apis::{configuration::Configuration, servers_api}; use hcloud::apis::{configuration::Configuration, servers_api::{self, ListServersParams}};
use hcloud::models::Server; use hcloud::models::Server;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -24,14 +24,33 @@ impl HetznerClient {
} }
pub async fn list_servers(&self) -> Result<Vec<WrappedServer>, Box<dyn std::error::Error>> { pub async fn list_servers(&self) -> Result<Vec<WrappedServer>, Box<dyn std::error::Error>> {
let servers = servers_api::list_servers(&self.configuration, Default::default()) let mut all_servers = Vec::new();
.await? let mut page = 1;
.servers let per_page = 50;
.into_iter()
.map(WrappedServer)
.collect();
Ok(servers) loop {
let params = ListServersParams {
page: Some(page),
per_page: Some(per_page),
..Default::default()
};
let response = servers_api::list_servers(&self.configuration, params).await?;
let mut servers: Vec<WrappedServer> = response.servers.into_iter().map(WrappedServer).collect();
let is_empty = servers.is_empty();
all_servers.append(&mut servers);
println!("next page? {:#?}", response.meta);
if is_empty || response.meta.pagination.next_page.is_none() {
break;
}
page += 1;
}
Ok(all_servers)
} }
pub async fn get_server_status(&self, server_id: i64) -> Result<String, Box<dyn std::error::Error>> { pub async fn get_server_status(&self, server_id: i64) -> Result<String, Box<dyn std::error::Error>> {