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

Apps listing API & Home webapp. #1101

Merged
merged 3 commits into from
May 19, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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