summaryrefslogtreecommitdiffstats
path: root/ipfs-api-prelude/src/request/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ipfs-api-prelude/src/request/mod.rs')
-rw-r--r--ipfs-api-prelude/src/request/mod.rs130
1 files changed, 130 insertions, 0 deletions
diff --git a/ipfs-api-prelude/src/request/mod.rs b/ipfs-api-prelude/src/request/mod.rs
new file mode 100644
index 0000000..95d47d7
--- /dev/null
+++ b/ipfs-api-prelude/src/request/mod.rs
@@ -0,0 +1,130 @@
+// 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.
+//
+
+pub use self::add::*;
+pub use self::bitswap::*;
+pub use self::block::*;
+pub use self::bootstrap::*;
+pub use self::cat::*;
+pub use self::commands::*;
+pub use self::config::*;
+pub use self::dag::*;
+pub use self::dht::*;
+pub use self::diag::*;
+pub use self::dns::*;
+pub use self::file::*;
+pub use self::files::*;
+pub use self::filestore::*;
+pub use self::get::*;
+pub use self::id::*;
+pub use self::key::*;
+pub use self::log::*;
+pub use self::ls::*;
+pub use self::name::*;
+pub use self::object::*;
+pub use self::pin::*;
+pub use self::ping::*;
+pub use self::pubsub::*;
+pub use self::refs::*;
+pub use self::shutdown::*;
+pub use self::stats::*;
+pub use self::swarm::*;
+pub use self::tar::*;
+pub use self::version::*;
+
+/// Create a test to verify that serializing a `ApiRequest` returns the expected
+/// url encoded string.
+///
+#[cfg(test)]
+macro_rules! serialize_url_test {
+ ($f: ident, $obj: expr, $exp: expr) => {
+ #[test]
+ fn $f() {
+ assert_eq!(::serde_urlencoded::to_string($obj), Ok($exp.to_string()))
+ }
+ };
+}
+
+/// Implements the `Serialize` trait for types that do not require
+/// serialization. This provides a workaround for a limitation in
+/// `serde_urlencoded`, that prevents unit structs from being serialized.
+///
+macro_rules! impl_skip_serialize {
+ ($ty: ty) => {
+ impl ::serde::Serialize for $ty {
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+ where
+ S: ::serde::Serializer,
+ {
+ serializer.serialize_none()
+ }
+ }
+ };
+}
+
+mod add;
+mod bitswap;
+mod block;
+mod bootstrap;
+mod cat;
+mod commands;
+mod config;
+mod dag;
+mod dht;
+mod diag;
+mod dns;
+mod file;
+mod files;
+mod filestore;
+mod get;
+mod id;
+mod key;
+mod log;
+mod ls;
+mod name;
+mod object;
+mod pin;
+mod ping;
+mod pubsub;
+mod refs;
+mod shutdown;
+mod stats;
+mod swarm;
+mod tar;
+mod version;
+
+use http::uri::Uri;
+use serde::Serialize;
+
+/// A request that can be made against the Ipfs API.
+///
+pub trait ApiRequest: Serialize {
+ /// Returns the API path that this request can be called on.
+ ///
+ /// All paths should begin with '/'.
+ ///
+ const PATH: &'static str;
+
+ /// Method used to make the request.
+ ///
+ const METHOD: http::Method = http::Method::POST;
+
+ /// Creates the absolute URL for an API resource given the base path
+ /// of the service.
+ ///
+ fn absolute_url(&self, base: &Uri) -> Result<Uri, crate::Error> {
+ format!(
+ "{}{}?{}",
+ base,
+ Self::PATH,
+ serde_urlencoded::to_string(self)?
+ )
+ .parse()
+ .map_err(crate::Error::from)
+ }
+}