summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFerris Tseng <ferristseng@fastmail.fm>2020-08-03 19:57:31 -0400
committerGitHub <noreply@github.com>2020-08-03 19:57:31 -0400
commit8bd79dc412c399dc59075a04b80c894baa108475 (patch)
tree8e830f84eaa20de7361a4f69817c0ca526e0ba52
parente4ecefe07bc0936898f4a7b4161ac4ff973a02aa (diff)
parent82accb206e45beeecef7995238ea6ad9a6c7c42c (diff)
Merge pull request #57 from SionoiS/dag
Dag API
-rw-r--r--ipfs-api/examples/dag.rs45
-rw-r--r--ipfs-api/src/client/internal.rs51
-rw-r--r--ipfs-api/src/request/dag.rs1
-rw-r--r--ipfs-api/src/response/dag.rs10
4 files changed, 85 insertions, 22 deletions
diff --git a/ipfs-api/examples/dag.rs b/ipfs-api/examples/dag.rs
new file mode 100644
index 0000000..9dff2bb
--- /dev/null
+++ b/ipfs-api/examples/dag.rs
@@ -0,0 +1,45 @@
+// Copyright 2017 rust-ipfs-api Developers
+//
+// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
+// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
+// http://opensource.org/licenses/MIT>, at your option. This file may not be
+// copied, modified, or distributed except according to those terms.
+//
+
+use futures::TryStreamExt;
+use ipfs_api::IpfsClient;
+use std::io::Cursor;
+
+// Creates an Ipfs client, and adds this dag object to Ipfs then fetch it back.
+//
+#[cfg_attr(feature = "actix", actix_rt::main)]
+#[cfg_attr(feature = "hyper", tokio::main)]
+async fn main() {
+ eprintln!("note: this must be run in the root of the project repository");
+ eprintln!("connecting to localhost:5001...");
+
+ let client = IpfsClient::default();
+
+ let dag_node = Cursor::new(r#"{"hello":"world"}"#);
+
+ let response = client
+ .dag_put(dag_node)
+ .await
+ .expect("error adding dag node");
+
+ let cid = response.cid.cid_string;
+
+ match client
+ .dag_get(&cid)
+ .map_ok(|chunk| chunk.to_vec())
+ .try_concat()
+ .await
+ {
+ Ok(bytes) => {
+ println!("{}", String::from_utf8_lossy(&bytes[..]));
+ }
+ Err(e) => {
+ eprintln!("error reading dag node: {}", e);
+ }
+ }
+}
diff --git a/ipfs-api/src/client/internal.rs b/ipfs-api/src/client/internal.rs
index 6921d9c..17059fd 100644
--- a/ipfs-api/src/client/internal.rs
+++ b/ipfs-api/src/client/internal.rs
@@ -845,33 +845,46 @@ impl IpfsClient {
/// Returns information about a dag node in Ipfs.
///
/// ```no_run
+ /// use futures::TryStreamExt;
/// use ipfs_api::IpfsClient;
///
/// let client = IpfsClient::default();
- /// let res = client.dag_get("QmXdNSQx7nbdRvkjGCEQgVjVtVwsHvV8NmV2a8xzQVwuFA");
+ /// let hash = "QmXdNSQx7nbdRvkjGCEQgVjVtVwsHvV8NmV2a8xzQVwuFA";
+ /// let res = client
+ /// .dag_get(hash)
+ /// .map_ok(|chunk| chunk.to_vec())
+ /// .try_concat();
/// ```
///
#[inline]
- pub async fn dag_get(&self, path: &str) -> Result<response::DagGetResponse, Error> {
- self.request(request::DagGet { path }, None).await
+ pub fn dag_get(&self, path: &str) -> impl Stream<Item = Result<Bytes, Error>> {
+ impl_stream_api_response! {
+ (self, request::DagGet { path }, None) => request_stream_bytes
+ }
}
- // TODO /dag routes are experimental, and there isn't a whole lot of
- // documentation available for how this route works.
- //
- // /// Add a DAG node to Ipfs.
- // ///
- // #[inline]
- // pub fn dag_put<R>(&self, data: R) -> AsyncResponse<response::DagPutResponse>
- // where
- // R: 'static + Read + Send,
- // {
- // let mut form = multipart::Form::default();
- //
- // form.add_reader("arg", data);
- //
- // self.request(&request::DagPut, Some(form))
- // }
+ /// Add a DAG node to Ipfs.
+ ///
+ /// ```no_run
+ /// use ipfs_api::IpfsClient;
+ /// use std::io::Cursor;
+ ///
+ /// let client = IpfsClient::default();
+ /// let data = Cursor::new(r#"{ "hello" : "world" }"#);
+ /// let res = client.dag_put(data);
+ /// ```
+ ///
+ #[inline]
+ pub async fn dag_put<R>(&self, data: R) -> Result<response::DagPutResponse, Error>
+ where
+ R: 'static + Read + Send + Sync,
+ {
+ let mut form = multipart::Form::default();
+
+ form.add_reader("object data", data);
+
+ self.request(request::DagPut, Some(form)).await
+ }
// TODO /dag/resolve
diff --git a/ipfs-api/src/request/dag.rs b/ipfs-api/src/request/dag.rs
index 4e2bde3..075b918 100644
--- a/ipfs-api/src/request/dag.rs
+++ b/ipfs-api/src/request/dag.rs
@@ -19,7 +19,6 @@ impl<'a> ApiRequest for DagGet<'a> {
const PATH: &'static str = "/dag/get";
}
-#[allow(dead_code)]
pub struct DagPut;
impl_skip_serialize!(DagPut);
diff --git a/ipfs-api/src/response/dag.rs b/ipfs-api/src/response/dag.rs
index c53a282..ecfcaac 100644
--- a/ipfs-api/src/response/dag.rs
+++ b/ipfs-api/src/response/dag.rs
@@ -29,9 +29,15 @@ pub struct DagGetResponse {
}
#[derive(Debug, Deserialize)]
-#[serde(rename_all = "PascalCase")]
pub struct DagPutResponse {
- pub cid: String,
+ #[serde(rename = "Cid")]
+ pub cid: Cid,
+}
+
+#[derive(Debug, Deserialize)]
+pub struct Cid {
+ #[serde(rename = "/")]
+ pub cid_string: String,
}
#[cfg(test)]