diff --git a/ipfs-api/src/client.rs b/ipfs-api/src/client.rs index 69411ee..8d97d66 100644 --- a/ipfs-api/src/client.rs +++ b/ipfs-api/src/client.rs @@ -444,7 +444,7 @@ impl IpfsClient { } impl IpfsClient { - /// Add file to Ipfs. + /// Add a file to IPFS. /// /// # Examples /// @@ -470,7 +470,38 @@ impl IpfsClient { form.add_reader("path", data); - self.request(&request::Add, Some(form)) + self.request(&request::Add::default(), Some(form)) + } + + /// Add a file to IPFS with options. + /// + /// # Examples + /// + /// ```no_run + /// # extern crate ipfs_api; + /// # + /// use ipfs_api::IpfsClient; + /// use std::io::Cursor; + /// + /// # fn main() { + /// let client = IpfsClient::default(); + /// let data = Cursor::new("Hello World!"); + /// let mut add = ipfs_api::request::Add::default(); + /// add.chunker = Some("rabin-512-1024-2048"); + /// let req = client.add_with_options(data, &add); + /// # } + /// ``` + /// + #[inline] + pub fn add_with_options(&self, data: R, add: &request::Add) -> AsyncResponse + where + R: 'static + Read + Send, + { + let mut form = multipart::Form::default(); + + form.add_reader("path", data); + + self.request(add, Some(form)) } /// Add a path to Ipfs. Can be a file or directory. @@ -546,7 +577,7 @@ impl IpfsClient { } Box::new( - self.request_stream_json(&request::Add, Some(form)) + self.request_stream_json(&request::Add::default(), Some(form)) .collect() .map(|mut responses: Vec| responses.pop().unwrap()), ) diff --git a/ipfs-api/src/lib.rs b/ipfs-api/src/lib.rs index 22568d8..cae1d20 100644 --- a/ipfs-api/src/lib.rs +++ b/ipfs-api/src/lib.rs @@ -206,5 +206,5 @@ pub use request::{KeyType, Logger, LoggingLevel, ObjectTemplate}; mod client; mod header; mod read; -mod request; +pub mod request; pub mod response; diff --git a/ipfs-api/src/request/add.rs b/ipfs-api/src/request/add.rs index 123ba4a..f1c6b07 100644 --- a/ipfs-api/src/request/add.rs +++ b/ipfs-api/src/request/add.rs @@ -9,11 +9,43 @@ use http::Method; use request::ApiRequest; -pub struct Add; +#[derive(Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct Add<'a, 'b> { + pub recursive: Option, + pub progress: Option, + pub trickle: Option, + pub only_hash: Option, + pub chunker: Option<&'a str>, + pub pin: Option, + pub raw_leaves: Option, + pub fscache: Option, + pub cid_version: Option, + pub hash: Option<&'b str>, + pub inline: Option, + pub inline_limit: Option +} -impl_skip_serialize!(Add); +impl<'a,'b> Default for Add<'a,'b> { + fn default() -> Self { + Self { + recursive: None, + progress: None, + trickle: None, + only_hash: None, + chunker: None, + pin: None, + raw_leaves: None, + fscache: None, + cid_version: None, + hash: None, + inline: None, + inline_limit: None, + } + } +} -impl ApiRequest for Add { +impl<'a, 'b> ApiRequest for Add<'a,'b> { const PATH: &'static str = "/add"; const METHOD: &'static Method = &Method::POST;