Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Commit

Permalink
Merge pull request #1101 from ethcore/apps-api
Browse files Browse the repository at this point in the history
Apps listing API & Home webapp.
  • Loading branch information
debris committed May 19, 2016
2 parents 6cff580 + ef38d9c commit bb56c58
Show file tree
Hide file tree
Showing 11 changed files with 212 additions and 35 deletions.
35 changes: 20 additions & 15 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 15 additions & 5 deletions webapp/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ name = "ethcore-webapp"
version = "1.2.0"
license = "GPL-3.0"
authors = ["Ethcore <[email protected]"]
build = "build.rs"

[lib]

Expand All @@ -13,15 +14,24 @@ jsonrpc-core = "2.0"
jsonrpc-http-server = { git = "https://github.com/ethcore/jsonrpc-http-server.git" }
hyper = { default-features = false, git = "https://github.com/ethcore/hyper" }
url = "1.0"
rustc-serialize = "0.3"
serde = "0.7.0"
serde_json = "0.7.0"
serde_macros = { version = "0.7.0", optional = true }
ethcore-rpc = { path = "../rpc" }
ethcore-util = { path = "../util" }
parity-webapp = { git = "https://github.com/ethcore/parity-webapp.git" }
parity-webapp = { git = "https://github.com/ethcore/parity-webapp.git", version = "0.2" }
# List of apps
parity-status = { git = "https://github.com/ethcore/parity-status.git", version = "0.4.1" }
parity-idmanager = { git = "https://github.com/ethcore/parity-idmanager-rs.git", version = "0.1.3" }
parity-wallet = { git = "https://github.com/ethcore/parity-wallet.git", version = "0.3.0", optional = true }
parity-status = { git = "https://github.com/ethcore/parity-status.git", version = "0.4.3" }
parity-idmanager = { git = "https://github.com/ethcore/parity-idmanager-rs.git", version = "0.2.2" }
parity-wallet = { git = "https://github.com/ethcore/parity-wallet.git", version = "0.4.0", optional = true }
clippy = { version = "0.0.67", optional = true}

[build-dependencies]
serde_codegen = { version = "0.7.0", optional = true }
syntex = "0.32.0"

[features]
default = ["parity-wallet"]
default = ["parity-wallet", "serde_codegen"]
nightly = ["serde_macros"]
dev = ["clippy", "ethcore-rpc/dev", "ethcore-util/dev"]
45 changes: 45 additions & 0 deletions webapp/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.

// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

#[cfg(not(feature = "serde_macros"))]
mod inner {
extern crate syntex;
extern crate serde_codegen;

use std::env;
use std::path::Path;

pub fn main() {
let out_dir = env::var_os("OUT_DIR").unwrap();

let src = Path::new("./src/api/mod.rs.in");
let dst = Path::new(&out_dir).join("mod.rs");

let mut registry = syntex::Registry::new();

serde_codegen::register(&mut registry);
registry.expand("", &src, &dst).unwrap();
}
}

#[cfg(feature = "serde_macros")]
mod inner {
pub fn main() {}
}

fn main() {
inner::main();
}
38 changes: 26 additions & 12 deletions webapp/src/api.rs → webapp/src/api/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,36 +14,50 @@
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

//! Simple REST API
use std::sync::Arc;
use endpoint::{Endpoint, Endpoints, ContentHandler, Handler, EndpointPath};
use endpoint::{Endpoint, Endpoints, Handler, EndpointPath};

use api::response::as_json;

pub struct RestApi {
endpoints: Arc<Endpoints>,
}

#[derive(Debug, PartialEq, Serialize)]
struct App {
pub id: String,
pub name: String,
pub description: String,
pub version: String,
pub author: String,
#[serde(rename="iconUrl")]
pub icon_url: String,
}

impl RestApi {
pub fn new(endpoints: Arc<Endpoints>) -> Box<Endpoint> {
Box::new(RestApi {
endpoints: endpoints
})
}

fn list_pages(&self) -> String {
let mut s = "[".to_owned();
for name in self.endpoints.keys() {
s.push_str(&format!("\"{}\",", name));
}
s.push_str("\"rpc\"");
s.push_str("]");
s
fn list_apps(&self) -> Vec<App> {
self.endpoints.iter().filter_map(|(ref k, ref e)| {
e.info().map(|ref info| App {
id: k.to_owned().clone(),
name: info.name.clone(),
description: info.description.clone(),
version: info.version.clone(),
author: info.author.clone(),
icon_url: info.icon_url.clone(),
})
}).collect()
}
}

impl Endpoint for RestApi {
fn to_handler(&self, _path: EndpointPath) -> Box<Handler> {
Box::new(ContentHandler::new(self.list_pages(), "application/json".to_owned()))
as_json(&self.list_apps())
}
}

28 changes: 28 additions & 0 deletions webapp/src/api/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.

// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

//! REST API
#![warn(missing_docs)]
#![cfg_attr(feature="nightly", feature(custom_derive, custom_attribute, plugin))]
#![cfg_attr(feature="nightly", plugin(serde_macros, clippy))]

#[cfg(feature = "serde_macros")]
include!("mod.rs.in");

#[cfg(not(feature = "serde_macros"))]
include!(concat!(env!("OUT_DIR"), "/mod.rs"));

20 changes: 20 additions & 0 deletions webapp/src/api/mod.rs.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.

// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

mod api;
mod response;

pub use self::api::RestApi;
23 changes: 23 additions & 0 deletions webapp/src/api/response.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.

// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

use serde::Serialize;
use serde_json;
use endpoint::{ContentHandler, Handler};

pub fn as_json<T : Serialize>(val: &T) -> Box<Handler> {
Box::new(ContentHandler::new(serde_json::to_string(val).unwrap(), "application/json".to_owned()))
}
3 changes: 2 additions & 1 deletion webapp/src/apps.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ pub const API_PATH : &'static str = "api";
pub const UTILS_PATH : &'static str = "parity-utils";

pub fn main_page() -> &'static str {
"/status/"
"/home/"
}

pub fn utils() -> Box<Endpoint> {
Expand All @@ -43,6 +43,7 @@ pub fn all_endpoints() -> Endpoints {

insert::<parity_status::App>(&mut pages, "status");
insert::<parity_status::App>(&mut pages, "parity");
insert::<parity_idmanager::App>(&mut pages, "home");

wallet_page(&mut pages);
pages
Expand Down
11 changes: 11 additions & 0 deletions webapp/src/endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,18 @@ pub struct EndpointPath {
pub port: u16,
}

#[derive(Debug, PartialEq)]
pub struct EndpointInfo {
pub name: String,
pub description: String,
pub version: String,
pub author: String,
pub icon_url: String,
}

pub trait Endpoint : Send + Sync {
fn info(&self) -> Option<EndpointInfo> { None }

fn to_handler(&self, path: EndpointPath) -> Box<server::Handler<HttpStream>>;
}

Expand Down
2 changes: 2 additions & 0 deletions webapp/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@
extern crate log;
extern crate url;
extern crate hyper;
extern crate serde;
extern crate serde_json;
extern crate jsonrpc_core;
extern crate jsonrpc_http_server;
extern crate parity_webapp;
Expand Down
22 changes: 20 additions & 2 deletions webapp/src/page/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ use hyper::header;
use hyper::status::StatusCode;
use hyper::net::HttpStream;
use hyper::{Decoder, Encoder, Next};
use endpoint::{Endpoint, EndpointPath};
use parity_webapp::WebApp;
use endpoint::{Endpoint, EndpointInfo, EndpointPath};
use parity_webapp::{WebApp, Info};

pub struct PageEndpoint<T : WebApp + 'static> {
/// Content of the files
Expand All @@ -39,6 +39,7 @@ impl<T: WebApp + 'static> PageEndpoint<T> {
prefix: None,
}
}

pub fn with_prefix(app: T, prefix: String) -> Self {
PageEndpoint {
app: Arc::new(app),
Expand All @@ -48,6 +49,11 @@ impl<T: WebApp + 'static> PageEndpoint<T> {
}

impl<T: WebApp> Endpoint for PageEndpoint<T> {

fn info(&self) -> Option<EndpointInfo> {
Some(EndpointInfo::from(self.app.info()))
}

fn to_handler(&self, path: EndpointPath) -> Box<server::Handler<HttpStream>> {
Box::new(PageHandler {
app: self.app.clone(),
Expand All @@ -59,6 +65,18 @@ impl<T: WebApp> Endpoint for PageEndpoint<T> {
}
}

impl From<Info> for EndpointInfo {
fn from(info: Info) -> Self {
EndpointInfo {
name: info.name,
description: info.description,
author: info.author,
icon_url: info.icon_url,
version: info.version,
}
}
}

struct PageHandler<T: WebApp + 'static> {
app: Arc<T>,
prefix: Option<String>,
Expand Down

0 comments on commit bb56c58

Please sign in to comment.