summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulius Michaelis <gitter@liftm.de>2020-10-24 19:21:29 +0900
committerJulius Michaelis <gitter@liftm.de>2020-10-24 20:21:53 +0900
commiteabde517363495d4f5c2962cce61878c3d047593 (patch)
tree791528495f5680114636af2b914a1e7246e164f1
parent38e8ad75e9310beac9846f982eecb7a0ba439bbd (diff)
ls_with_options
-rw-r--r--ipfs-api/src/client/internal.rs38
-rw-r--r--ipfs-api/src/request/ls.rs19
2 files changed, 51 insertions, 6 deletions
diff --git a/ipfs-api/src/client/internal.rs b/ipfs-api/src/client/internal.rs
index 7ee856b..607f4c1 100644
--- a/ipfs-api/src/client/internal.rs
+++ b/ipfs-api/src/client/internal.rs
@@ -1942,13 +1942,47 @@ impl IpfsClient {
/// use ipfs_api::IpfsClient;
///
/// let client = IpfsClient::default();
- /// let res = client.ls(None);
/// let res = client.ls(Some("/ipfs/QmVrLsEDn27sScp3k23sgZNefVTjSAL3wpgW1iWPi4MgoY"));
/// ```
///
#[inline]
pub async fn ls(&self, path: Option<&str>) -> Result<response::LsResponse, Error> {
- self.request(request::Ls { path }, None).await
+ self.request(request::Ls {
+ path: path.expect("Path is not actually optional"),
+ stream: None,
+ resolve_type: None,
+ size: None,
+ }, 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");
}