use super::*;
use url::Url;
use constants::*;
use std::num::Wrapping;
use http::Uri;
#[derive(Debug)]
pub struct Factom{
pub client: HttpsClient,
pub factomd_uri: Rc<Uri>,
pub walletd_uri: Rc<Uri>,
pub debug_uri: Rc<Uri>,
pub id: Wrapping<usize>
}
impl Factom {
pub fn new() -> Factom {
Factom::local_node()
}
pub fn local_node() -> Factom {
let factomd_uri = parse_uri(FACTOMD_DEFAULT);
let walletd_uri = parse_uri(WALLETD_DEFAULT);
let debug_uri = parse_debug_uri(FACTOMD_DEFAULT);
Factom{
client: new_client(),
factomd_uri,
walletd_uri,
debug_uri,
id: Wrapping(ID)
}
}
pub fn open_node()->Factom {
let factomd_uri = parse_uri(OPENNODE_URI);
let walletd_uri = parse_uri(WALLETD_DEFAULT);
let debug_uri = parse_debug_uri(OPENNODE_URI);
Factom{
client: new_client(),
factomd_uri,
walletd_uri,
debug_uri,
id: Wrapping(ID)
}
}
pub fn testnet_node()->Factom {
let factomd_uri = parse_uri(DEV_OPENNODE_URI);
let walletd_uri = parse_uri(WALLETD_DEFAULT);
let debug_uri = parse_debug_uri(DEV_OPENNODE_URI);
Factom{
client: new_client(),
factomd_uri,
walletd_uri,
debug_uri,
id: Wrapping(ID)
}
}
pub fn custom_node(factomd: &str, walletd: &str) -> Factom {
let factomd_uri = parse_uri(factomd);
let walletd_uri = parse_uri(walletd);
let debug_uri = parse_debug_uri(factomd);
Factom{
client: new_client(),
factomd_uri,
walletd_uri,
debug_uri,
id: Wrapping(ID)
}
}
pub fn increment_id(mut self) {
self.id += Wrapping(1);
}
pub fn set_id(mut self, id: usize) {
self.id = Wrapping(id);
}
}
fn new_client() -> HttpsClient {
let connector = HttpsConnector::new();
let client = Client::builder().build::<_, hyper::Body>(connector);
Rc::new(client)
}
impl Clone for Factom {
fn clone(&self) -> Self {
let client = Rc::clone(&self.client);
Factom {
client,
factomd_uri: Rc::clone(&self.factomd_uri),
walletd_uri: Rc::clone(&self.walletd_uri),
debug_uri: Rc::clone(&self.debug_uri),
id: self.id
}
}
}
pub fn parse_debug_uri(host: &str) -> Rc<Uri> {
inner_parse_uri(host, DEBUG)
}
pub fn parse_uri(host: &str) -> Rc<Uri> {
inner_parse_uri(host, API_VERSION)
}
fn inner_parse_uri(host: &str, path: &str) -> Rc<Uri> {
let mut url = Url::parse(host).expect("Parsing Url");
url.set_path(path);
let output: Uri = url.into_string()
.parse()
.expect("Parsing Uri");
Rc::new(output)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn inner_uri_parsing() {
let test_uri = inner_parse_uri("http://host", "testing");
assert_eq!(test_uri, Rc::new(Uri::from_static("http://host/testing")));
}
#[test]
fn uri_parsing() {
let test_uri = parse_uri("http://host");
assert_eq!(test_uri, Rc::new(Uri::from_static("http://host/v2")));
}
#[test]
fn debug_uri_parsing() {
let test_uri = parse_debug_uri("http://host");
assert_eq!(test_uri, Rc::new(Uri::from_static("http://host/debug")));
}
}