summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFerris Tseng <ferristseng@fastmail.fm>2020-11-01 19:32:56 -0500
committerGitHub <noreply@github.com>2020-11-01 19:32:56 -0500
commitc2b10b69472bf9fdd5ac74865dcb2f667a159c57 (patch)
tree9dd5560a65a78a44d8dd3cda41669a07d869967a
parent38e8ad75e9310beac9846f982eecb7a0ba439bbd (diff)
parent61c5b741eb3d6a02f075c6da2ce93d715d16f446 (diff)
Merge pull request #61 from jcaesar/master
ls_with_options
-rw-r--r--ipfs-api/src/client/internal.rs40
-rw-r--r--ipfs-api/src/request/ls.rs19
2 files changed, 51 insertions, 8 deletions
diff --git a/ipfs-api/src/client/internal.rs b/ipfs-api/src/client/internal.rs
index 7ee856b..1b544ee 100644
--- a/ipfs-api/src/client/internal.rs
+++ b/ipfs-api/src/client/internal.rs
@@ -1942,13 +1942,45 @@ impl IpfsClient {
/// use ipfs_api::IpfsClient;
///
/// let client = IpfsClient::default();
- /// let res = client.ls(None);
- /// let res = client.ls(Some("/ipfs/QmVrLsEDn27sScp3k23sgZNefVTjSAL3wpgW1iWPi4MgoY"));
+ /// let res = client.ls("/ipfs/QmVrLsEDn27sScp3k23sgZNefVTjSAL3wpgW1iWPi4MgoY");
/// ```
///
#[inline]
- pub async fn ls(&self, path: Option<&str>) -> Result<response::LsResponse, Error> {
- self.request(request::Ls { path }, None).await
+ pub async fn ls(&self, path: &str) -> Result<response::LsResponse, Error> {
+ self.request(request::Ls {
+ path: path,
+ .. Default::default()
+ }, None).await
+ }
+
+ /// List the contents of an Ipfs multihash.
+ ///
+ /// ```no_run
+ /// use ipfs_api::IpfsClient;
+ ///
+ /// let client = IpfsClient::default();
+ /// #[cfg(feature = "builder")]
+ /// let _ = client.ls_with_options(ipfs_api::request::Ls::builder()
+ /// .path("/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n")
+ /// .build()
+ /// );
+ /// let _ = client.ls_with_options(ipfs_api::request::Ls {
+ /// path: "/ipfs/QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n",
+ /// // Example options for fast listing
+ /// stream: Some(true),
+ /// resolve_type: Some(false),
+ /// size: Some(false),
+ /// });
+ /// ```
+ ///
+ #[inline]
+ pub async fn ls_with_options(
+ &self,
+ options: request::Ls<'_>
+ ) -> impl Stream<Item = Result<response::LsResponse, Error>> {
+ impl_stream_api_response! {
+ (self, options, None) => request_stream_json
+ }
}
// TODO /mount
diff --git a/ipfs-api/src/request/ls.rs b/ipfs-api/src/request/ls.rs
index 69e456a..eb6a1fa 100644
--- a/ipfs-api/src/request/ls.rs
+++ b/ipfs-api/src/request/ls.rs
@@ -9,10 +9,21 @@
use crate::request::ApiRequest;
use crate::serde::Serialize;
-#[derive(Serialize)]
+#[cfg_attr(feature = "builder", derive(TypedBuilder))]
+#[derive(Serialize, Default)]
+#[serde(rename_all = "kebab-case")]
pub struct Ls<'a> {
#[serde(rename = "arg")]
- pub path: Option<&'a str>,
+ pub path: &'a str,
+ /// Resolve linked objects to find out their types. Default: `true`
+ #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
+ pub resolve_type: Option<bool>,
+ /// Resolve linked objects to find out their file size. Default: `true`
+ #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
+ pub size: Option<bool>,
+ /// Enable experimental streaming of directory entries as they are traversed.
+ #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))]
+ pub stream: Option<bool>,
}
impl<'a> ApiRequest for Ls<'a> {
@@ -23,6 +34,6 @@ impl<'a> ApiRequest for Ls<'a> {
mod tests {
use super::Ls;
- serialize_url_test!(test_serializes_0, Ls { path: Some("test") }, "arg=test");
- serialize_url_test!(test_serializes_1, Ls { path: None }, "");
+ serialize_url_test!(test_serializes_0, Ls { path: "test", .. Default::default() }, "arg=test");
+ serialize_url_test!(test_serializes_1, Ls { path: "asdf", resolve_type: Some(true), size: Some(true), stream: Some(false) }, "arg=asdf&resolve-type=true&size=true&stream=false");
}