Add field endpoint
This commit is contained in:
@@ -79,11 +79,9 @@ impl PileClient {
|
||||
|
||||
/// `GET /datasets` — list all datasets served by this server.
|
||||
pub async fn list_datasets(&self) -> Result<Vec<DatasetInfo>, ClientError> {
|
||||
let resp = self
|
||||
.client
|
||||
.get(format!("{}/datasets", self.base_url))
|
||||
.send()
|
||||
.await?;
|
||||
let url = format!("{}/datasets", self.base_url);
|
||||
trace!(url, "GET /datasets");
|
||||
let resp = self.client.get(url).send().await?;
|
||||
|
||||
check_status(resp).await?.json().await.map_err(Into::into)
|
||||
}
|
||||
@@ -112,12 +110,9 @@ impl DatasetClient {
|
||||
limit,
|
||||
};
|
||||
|
||||
let resp = self
|
||||
.client
|
||||
.post(format!("{}/lookup", self.base_url))
|
||||
.json(&body)
|
||||
.send()
|
||||
.await?;
|
||||
let url = format!("{}/lookup", self.base_url);
|
||||
trace!(url, "POST /lookup");
|
||||
let resp = self.client.post(url).json(&body).send().await?;
|
||||
|
||||
check_status(resp).await?.json().await.map_err(Into::into)
|
||||
}
|
||||
@@ -130,9 +125,11 @@ impl DatasetClient {
|
||||
source: &str,
|
||||
key: &str,
|
||||
) -> Result<Pin<Box<dyn Stream<Item = Result<Bytes, reqwest::Error>> + Send>>, ClientError> {
|
||||
let url = format!("{}/item", self.base_url);
|
||||
trace!(url, source, key, "GET /item");
|
||||
let resp = self
|
||||
.client
|
||||
.get(format!("{}/item", self.base_url))
|
||||
.get(url)
|
||||
.query(&[("source", source), ("key", key)])
|
||||
.send()
|
||||
.await?;
|
||||
@@ -140,16 +137,18 @@ impl DatasetClient {
|
||||
Ok(Box::pin(check_status(resp).await?.bytes_stream()))
|
||||
}
|
||||
|
||||
/// `GET /field` — extract a field from an item by object path (e.g. `$.flac.title`).
|
||||
pub async fn get_field(
|
||||
/// `GET /extract` — extract a field from an item by object path (e.g. `$.flac.title`).
|
||||
pub async fn get_extract(
|
||||
&self,
|
||||
source: &str,
|
||||
key: &str,
|
||||
path: &str,
|
||||
) -> Result<FieldResponse, ClientError> {
|
||||
let url = format!("{}/extract", self.base_url);
|
||||
trace!(url, source, key, path, "GET /extract");
|
||||
let resp = self
|
||||
.client
|
||||
.get(format!("{}/field", self.base_url))
|
||||
.get(url)
|
||||
.query(&[("source", source), ("key", key), ("path", path)])
|
||||
.send()
|
||||
.await?;
|
||||
@@ -168,15 +167,47 @@ impl DatasetClient {
|
||||
Ok(FieldResponse { content_type, data })
|
||||
}
|
||||
|
||||
/// `GET /field` — get a field from an item's schema
|
||||
pub async fn get_field(
|
||||
&self,
|
||||
source: &str,
|
||||
key: &str,
|
||||
field: &str,
|
||||
) -> Result<FieldResponse, ClientError> {
|
||||
let url = format!("{}/field", self.base_url);
|
||||
trace!(url, source, key, field, "GET /field");
|
||||
let resp = self
|
||||
.client
|
||||
.get(url)
|
||||
.query(&[("source", source), ("key", key), ("field", field)])
|
||||
.send()
|
||||
.await?;
|
||||
|
||||
let resp = check_status(resp).await?;
|
||||
|
||||
let content_type = resp
|
||||
.headers()
|
||||
.get(header::CONTENT_TYPE)
|
||||
.and_then(|v| v.to_str().ok())
|
||||
.unwrap_or("application/octet-stream")
|
||||
.to_owned();
|
||||
|
||||
let data = resp.bytes().await?;
|
||||
|
||||
Ok(FieldResponse { content_type, data })
|
||||
}
|
||||
|
||||
/// `GET /items` — paginate over all items in this dataset, ordered by (source, key).
|
||||
pub async fn list_items(
|
||||
&self,
|
||||
offset: usize,
|
||||
limit: usize,
|
||||
) -> Result<ItemsResponse, ClientError> {
|
||||
let url = format!("{}/items", self.base_url);
|
||||
trace!(url, offset, limit, "GET /items");
|
||||
let resp = self
|
||||
.client
|
||||
.get(format!("{}/items", self.base_url))
|
||||
.get(url)
|
||||
.query(&[("offset", offset), ("limit", limit)])
|
||||
.send()
|
||||
.await?;
|
||||
|
||||
Reference in New Issue
Block a user