From eabde517363495d4f5c2962cce61878c3d047593 Mon Sep 17 00:00:00 2001 From: Julius Michaelis Date: Sat, 24 Oct 2020 19:21:29 +0900 Subject: ls_with_options --- ipfs-api/src/client/internal.rs | 38 ++++++++++++++++++++++++++++++++++++-- ipfs-api/src/request/ls.rs | 19 +++++++++++++++---- 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 { - 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> { + 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, + /// Resolve linked objects to find out their file size. Default: `true` + #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))] + pub size: Option, + /// Enable experimental streaming of directory entries as they are traversed. + #[cfg_attr(feature = "builder", builder(default, setter(strip_option)))] + pub stream: Option, } 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"); } -- cgit v1.2.3