Add field endpoint
Some checks failed
CI / Typos (push) Successful in 17s
CI / Build and test (push) Failing after 2m37s
CI / Clippy (push) Successful in 3m29s
CI / Build and test (all features) (push) Has been cancelled

This commit is contained in:
2026-03-24 09:44:01 -07:00
parent f7ea25f059
commit 5b0953d250
6 changed files with 224 additions and 60 deletions

View File

@@ -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?;