From 1f75bbcb1f138c19262b26bec64ca238903da0f0 Mon Sep 17 00:00:00 2001 From: NikVolf Date: Tue, 13 Dec 2016 13:17:57 +0100 Subject: [PATCH] json-rpc layout --- rpc/src/v1/helpers/errors.rs | 9 +++++++++ rpc/src/v1/impls/network.rs | 32 ++++++++++++++++++++++++++++++-- rpc/src/v1/traits/network.rs | 7 ++++--- rpc/src/v1/types/mod.rs.in | 2 +- rpc/src/v1/types/nodes.rs | 29 ++++++++++++++++++++++++++++- 5 files changed, 72 insertions(+), 7 deletions(-) diff --git a/rpc/src/v1/helpers/errors.rs b/rpc/src/v1/helpers/errors.rs index b14f70a5..984b0a27 100644 --- a/rpc/src/v1/helpers/errors.rs +++ b/rpc/src/v1/helpers/errors.rs @@ -2,6 +2,7 @@ mod codes { // NOTE [ToDr] Codes from [-32099, -32000] + pub const UNKNOWN: i64 = -32000; pub const EXECUTION_ERROR: i64 = -32015; pub const TRANSACTION_NOT_FOUND: i64 = -32096; pub const TRANSACTION_OUTPUT_NOT_FOUND: i64 = -32097; @@ -97,3 +98,11 @@ pub fn node_not_added() -> Error { data: None, } } + +pub fn unknown() -> Error { + Error { + code: ErrorCode::ServerError(codes::UNKNOWN), + message: "Unknown error has occurred".into(), + data: None, + } +} diff --git a/rpc/src/v1/impls/network.rs b/rpc/src/v1/impls/network.rs index 842996c8..e58136a8 100644 --- a/rpc/src/v1/impls/network.rs +++ b/rpc/src/v1/impls/network.rs @@ -1,8 +1,9 @@ use std::sync::Arc; -use std::net::SocketAddr; +use std::net::{SocketAddr, IpAddr}; use v1::traits::Network as NetworkRpc; -use v1::types::AddNodeOperation; +use v1::types::{AddNodeOperation, NodeInfo}; use jsonrpc_core::Error; +use jsonrpc_macros::Trailing; use v1::helpers::errors; use p2p; @@ -10,6 +11,8 @@ pub trait NetworkApi : Send + Sync + 'static { fn add_node(&self, socket_addr: SocketAddr) -> Result<(), p2p::NodeTableError>; fn remove_node(&self, socket_addr: SocketAddr) -> Result<(), p2p::NodeTableError>; fn connect(&self, socket_addr: SocketAddr); + fn node_info(&self, node_addr: IpAddr) -> Result; + fn nodes_info(&self) -> Vec; } impl NetworkRpc for NetworkClient where T: NetworkApi { @@ -29,6 +32,23 @@ impl NetworkRpc for NetworkClient where T: NetworkApi { } } } + + fn node_info(&self, _dns: bool, node_addr: Trailing) -> Result, Error> { + Ok( + if node_addr.0.is_empty() { + self.api.nodes_info() + } + else { + let addr = try!(node_addr.0.parse().map_err( + |_| errors::invalid_params("node", "Invalid ip address format, should be ip address (127.0.0.1)"))); + let node_info = try!( + self.api.node_info(addr) + .map_err(|_| errors::node_not_added()) + ); + vec![node_info] + } + ) + } } pub struct NetworkClient { @@ -65,4 +85,12 @@ impl NetworkApi for NetworkClientCore { fn connect(&self, socket_addr: SocketAddr) { p2p::Context::connect_normal(self.p2p.clone(), socket_addr); } + + fn node_info(&self, node_addr: IpAddr) -> Result { + Err(p2p::NodeTableError::NoAddressInTable) + } + + fn nodes_info(&self) -> Vec { + vec![] + } } diff --git a/rpc/src/v1/traits/network.rs b/rpc/src/v1/traits/network.rs index 7bb24364..e0d23e50 100644 --- a/rpc/src/v1/traits/network.rs +++ b/rpc/src/v1/traits/network.rs @@ -1,5 +1,6 @@ use jsonrpc_core::Error; -use v1::types::AddNodeOperation; +use jsonrpc_macros::Trailing; +use v1::types::{AddNodeOperation, NodeInfo}; build_rpc_trait! { /// Parity-bitcoin network interface @@ -11,9 +12,9 @@ build_rpc_trait! { #[rpc(name = "addnode")] fn add_node(&self, String, AddNodeOperation) -> Result<(), Error>; /// Query node(s) info - /// @curl-example: curl --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getaddednodeinfo", "params": [true, "192.168.0.201"] }' -H 'content-type: application/json;' http://127.0.0.1:8332/ + /// @curl-example: curl --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getaddednodeinfo", "params": [true] }' -H 'content-type: application/json;' http://127.0.0.1:8332/ /// @curl-example: curl --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getaddednodeinfo", "params": [true, "192.168.0.201"] }' -H 'content-type: application/json;' http://127.0.0.1:8332/ #[rpc(name = "getaddednodeinfo")] - fn node_info(&self, bool, String) -> Result<(), Error>; + fn node_info(&self, bool, Trailing) -> Result, Error>; } } diff --git a/rpc/src/v1/types/mod.rs.in b/rpc/src/v1/types/mod.rs.in index 93f55b42..5309df74 100644 --- a/rpc/src/v1/types/mod.rs.in +++ b/rpc/src/v1/types/mod.rs.in @@ -22,4 +22,4 @@ pub use self::raw_block::RawBlock; pub use self::raw_transaction::RawTransaction; pub use self::script::ScriptType; pub use self::uint::U256; -pub use self::nodes::AddNodeOperation; +pub use self::nodes::{AddNodeOperation, NodeInfo}; diff --git a/rpc/src/v1/types/nodes.rs b/rpc/src/v1/types/nodes.rs index 0ba9ff50..f1a157c6 100644 --- a/rpc/src/v1/types/nodes.rs +++ b/rpc/src/v1/types/nodes.rs @@ -1,4 +1,4 @@ -use serde::{Deserialize, Deserializer}; +use serde::{Serialize, Serializer, Deserialize, Deserializer}; #[derive(Debug, PartialEq)] pub enum AddNodeOperation { @@ -29,3 +29,30 @@ impl Deserialize for AddNodeOperation { deserializer.deserialize(DummyVisitor) } } + +#[derive(Serialize)] +pub struct NodeInfoAddress { + address: String, + connected: NodeInfoAddressConnectionType, +} + +#[derive(Serialize)] +pub struct NodeInfo { + addednode: String, + connected: bool, + addresses: Vec, +} + +pub enum NodeInfoAddressConnectionType { + Inbound, + Outbound, +} + +impl Serialize for NodeInfoAddressConnectionType { + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> where S: Serializer { + match *self { + NodeInfoAddressConnectionType::Inbound => "inbound".serialize(serializer), + NodeInfoAddressConnectionType::Outbound => "outbound".serialize(serializer), + } + } +}