From c44b62ded3dd1faed5de96ffdea2fc4b3d5d8b4f Mon Sep 17 00:00:00 2001 From: Ferris Tseng Date: Tue, 23 Jan 2018 20:02:08 -0500 Subject: add /name/publish and /name/resolve --- ipfs-api/examples/resolve_name.rs | 39 ++++++++++++++++++++ ipfs-api/src/client.rs | 76 +++++++++++++++++++++++++++++++++++++-- ipfs-api/src/request/mod.rs | 2 ++ ipfs-api/src/request/name.rs | 39 ++++++++++++++++++++ 4 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 ipfs-api/examples/resolve_name.rs create mode 100644 ipfs-api/src/request/name.rs diff --git a/ipfs-api/examples/resolve_name.rs b/ipfs-api/examples/resolve_name.rs new file mode 100644 index 0000000..dd13d26 --- /dev/null +++ b/ipfs-api/examples/resolve_name.rs @@ -0,0 +1,39 @@ +// Copyright 2017 rust-ipfs-api Developers +// +// Licensed under the Apache License, Version 2.0, or the MIT license , at your option. This file may not be +// copied, modified, or distributed except according to those terms. +// + +extern crate ipfs_api; +extern crate tokio_core; + +use ipfs_api::IpfsClient; +use tokio_core::reactor::Core; + +const IPFS_IPNS: &str = "/ipns/ipfs.io"; + +// Creates an Ipfs client, and resolves the Ipfs domain name, and +// publishes a path to Ipns. +// +fn main() { + println!("connecting to localhost:5001..."); + + let mut core = Core::new().expect("expected event loop"); + let client = IpfsClient::default(&core.handle()); + let req = client.name_resolve(Some(IPFS_IPNS), true, false); + let resolved = core.run(req).expect("expected a valid response"); + + println!("{} resolves to: {}", IPFS_IPNS, &resolved.path); + + let req = client.name_publish(IPFS_IPNS, true, None, None, None); + let publish = core.run(req).expect("expected a valid response"); + + println!("published {} to: /ipns/{}", IPFS_IPNS, &publish.name); + + let req = client.name_resolve(Some(&publish.name), true, false); + let resolved = core.run(req).expect("expected a valid response"); + + println!("/ipns/{} resolves to: {}", &publish.name, &resolved.path); +} diff --git a/ipfs-api/src/client.rs b/ipfs-api/src/client.rs index 4c8b010..dd64680 100644 --- a/ipfs-api/src/client.rs +++ b/ipfs-api/src/client.rs @@ -1557,9 +1557,81 @@ impl IpfsClient { // TODO /mount - // TODO /name/publish + /// Publish an IPFS path to IPNS. + /// + /// ```no_run + /// # extern crate ipfs_api; + /// # extern crate tokio_core; + /// # + /// use ipfs_api::IpfsClient; + /// use tokio_core::reactor::Core; + /// + /// # fn main() { + /// let mut core = Core::new().unwrap(); + /// let client = IpfsClient::default(&core.handle()); + /// let req = client.name_publish( + /// "/ipfs/QmVrLsEDn27sScp3k23sgZNefVTjSAL3wpgW1iWPi4MgoY", + /// false, + /// Some("12h"), + /// None, + /// None); + /// # } + /// ``` + /// + pub fn name_publish( + &self, + path: &str, + resolve: bool, + lifetime: Option<&str>, + ttl: Option<&str>, + key: Option<&str>, + ) -> AsyncResponse { + self.request( + &request::NamePublish { + path, + resolve, + lifetime, + ttl, + key, + }, + None, + ) + } - // TODO /name/resolve + /// Resolve an IPNS name. + /// + /// ```no_run + /// # extern crate ipfs_api; + /// # extern crate tokio_core; + /// # + /// use ipfs_api::IpfsClient; + /// use tokio_core::reactor::Core; + /// + /// # fn main() { + /// let mut core = Core::new().unwrap(); + /// let client = IpfsClient::default(&core.handle()); + /// let req = client.name_resolve( + /// Some("/ipns/ipfs.io"), + /// true, + /// false); + /// # } + /// ``` + /// + pub fn name_resolve( + &self, + name: Option<&str>, + recursive: bool, + nocache: bool, + ) -> AsyncResponse { + self.request( + &request::NameResolve { + name, + recursive, + nocache, + }, + None, + ) + } // TODO /object/data diff --git a/ipfs-api/src/request/mod.rs b/ipfs-api/src/request/mod.rs index 7e57b64..defd0ca 100644 --- a/ipfs-api/src/request/mod.rs +++ b/ipfs-api/src/request/mod.rs @@ -25,6 +25,7 @@ pub use self::log::*; pub use self::ls::*; pub use self::id::*; pub use self::key::*; +pub use self::name::*; pub use self::object::*; pub use self::pin::*; pub use self::ping::*; @@ -86,6 +87,7 @@ mod log; mod ls; mod id; mod key; +mod name; mod object; mod pin; mod ping; diff --git a/ipfs-api/src/request/name.rs b/ipfs-api/src/request/name.rs new file mode 100644 index 0000000..5def7b7 --- /dev/null +++ b/ipfs-api/src/request/name.rs @@ -0,0 +1,39 @@ +// Copyright 2017 rust-ipfs-api Developers +// +// Licensed under the Apache License, Version 2.0, or the MIT license , at your option. This file may not be +// copied, modified, or distributed except according to those terms. +// + +use request::ApiRequest; + +#[derive(Serialize)] +pub struct NamePublish<'a, 'b, 'c, 'd> { + #[serde(rename = "arg")] pub path: &'a str, + + pub resolve: bool, + + pub lifetime: Option<&'b str>, + + pub ttl: Option<&'c str>, + + pub key: Option<&'d str>, +} + +impl<'a, 'b, 'c, 'd> ApiRequest for NamePublish<'a, 'b, 'c, 'd> { + const PATH: &'static str = "/name/publish"; +} + +#[derive(Serialize)] +pub struct NameResolve<'a> { + #[serde(rename = "arg")] pub name: Option<&'a str>, + + pub recursive: bool, + + pub nocache: bool, +} + +impl<'a> ApiRequest for NameResolve<'a> { + const PATH: &'static str = "/name/resolve"; +} -- cgit v1.2.3