summaryrefslogtreecommitdiff
path: root/src/with_index.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/with_index.rs')
-rw-r--r--src/with_index.rs31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/with_index.rs b/src/with_index.rs
index adce169..ba94779 100644
--- a/src/with_index.rs
+++ b/src/with_index.rs
@@ -1,14 +1,39 @@
-use std::fmt::{Debug, Display};
+use std::fmt::{Debug, Display, Write};
use anyhow::{bail, Result};
+use log::*;
use reqwest::Response;
+use serde::Deserialize;
+
+use crate::Consul;
+
+impl Consul {
+ pub(crate) async fn get_with_index<T: for<'de> Deserialize<'de>>(
+ &self,
+ mut url: String,
+ last_index: Option<usize>,
+ ) -> Result<WithIndex<T>> {
+ if let Some(i) = last_index {
+ if url.contains('?') {
+ write!(&mut url, "&index={}", i).unwrap();
+ } else {
+ write!(&mut url, "?index={}", i).unwrap();
+ }
+ }
+ debug!("GET {} as {}", url, std::any::type_name::<T>());
+
+ let http = self.client.get(&url).send().await?;
+
+ Ok(WithIndex::<T>::index_from(&http)?.value(http.json().await?))
+ }
+}
/// Wraps the returned value of an [API call with blocking
/// possibility](https://developer.hashicorp.com/consul/api-docs/features/blocking) with the
/// returned Consul index
pub struct WithIndex<T> {
- value: T,
- index: usize,
+ pub(crate) value: T,
+ pub(crate) index: usize,
}
impl<T> WithIndex<T> {