From 9aea381f940ae85eddd10a892752a0fe87d81da9 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 21 Oct 2018 14:54:08 +0200 Subject: Add support for multiple parent blocks when posting --- src/cli_ui.rs | 10 +++++----- src/main.rs | 10 ++++++---- src/repository/client.rs | 38 ++++++++++++++++++++++++-------------- src/repository/mod.rs | 6 +++--- 4 files changed, 38 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/cli_ui.rs b/src/cli_ui.rs index 7b3c29b..d105041 100644 --- a/src/cli_ui.rs +++ b/src/cli_ui.rs @@ -401,19 +401,19 @@ pub fn build_ui<'a>() -> App<'a, 'a> { .multiple(false) .help("Name of the profile to post to") ) - .arg(Arg::with_name("parent") + .arg(Arg::with_name("text") .index(2) .required(true) .takes_value(true) .multiple(false) - .help("Parent block") + .help("Text to post") ) - .arg(Arg::with_name("text") + .arg(Arg::with_name("parents") .index(3) .required(true) .takes_value(true) - .multiple(false) - .help("Text to post") + .multiple(true) + .help("Parent block(s)") ) ) diff --git a/src/main.rs b/src/main.rs index cd70b96..f673081 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ extern crate toml; extern crate config; extern crate hyper; extern crate env_logger; +extern crate itertools; #[macro_use] extern crate is_match; #[macro_use] extern crate serde_derive; @@ -796,11 +797,12 @@ fn main() { .map(ProfileName::from) .unwrap(); // safe by clap - let parent_block_hash = mtch - .value_of("parent") + let parent_block_hashes = mtch + .values_of("parents") + .unwrap() // safe by clap .map(String::from) .map(IPFSHash::from) - .unwrap(); // safe by clap + .collect::>(); let text = mtch .value_of("text") @@ -815,7 +817,7 @@ fn main() { repo.clone() .get_key_id_from_key_name(publish_key_name.clone()) .and_then(move |key_id| { - repo.new_text_post(key_id, parent_block_hash, text, Some(time)) + repo.new_text_post(key_id, parent_block_hashes, text, Some(time)) }) .map(|hash| { println!("{}", hash); diff --git a/src/repository/client.rs b/src/repository/client.rs index 0273097..013fc08 100644 --- a/src/repository/client.rs +++ b/src/repository/client.rs @@ -11,6 +11,7 @@ use futures::stream::Stream; use serde_json::from_str as serde_json_from_str; use serde_json::to_string as serde_json_to_str; use chrono::NaiveDateTime; +use itertools::Itertools; use types::block::Block; use types::content::Content; @@ -252,23 +253,33 @@ pub fn new_profile(client: Arc, pub fn new_text_post(client: Arc, publish_key_id: ProfileKey, - latest_block: IPFSHash, + parent_blocks: Vec, text: String, time: Option) -> impl Future { - let client1 = client.clone(); - let client2 = client.clone(); let client3 = client.clone(); let client4 = client.clone(); let client5 = client.clone(); - resolve_block(client.clone(), &latest_block) // get devices from latest block - .and_then(|block| { - resolve_content(client1, block.content()) - }) - .and_then(move |content| { - put_plain(client2, text.into_bytes()) + let iterator = parent_blocks + .clone() + .into_iter() + .map(move |parent_block| { + let client1 = client.clone(); + let client2 = client.clone(); + resolve_block(client1, &parent_block) + .and_then(move |block| { + resolve_content(client2, block.content()) + }) + .map(|content| content.devices().to_vec()) + }); + + ::futures::future::join_all(iterator) + .and_then(move |devices| { + let devices = Iterator::flatten(devices.into_iter()).unique().collect(); + + put_plain(client3, text.into_bytes()) .and_then(move |content_hash| { let post = Payload::Post { content_format: ::mime::TEXT_PLAIN.into(), @@ -279,16 +290,15 @@ pub fn new_text_post(client: Arc, comments_propagated_until: None, }; - let devices = content.devices(); let ts = time.map(Timestamp::from); - let content_obj = Content::new(devices.to_vec(), ts, post); + let content_obj = Content::new(devices, ts, post); - put_content(client3, &content_obj) + put_content(client4, &content_obj) }) }) .and_then(move |content_obj_hash| { - let block = Block::new(protocol_version(), vec![latest_block], content_obj_hash); - put_block(client4, &block) + let block = Block::new(protocol_version(), parent_blocks, content_obj_hash); + put_block(client5, &block) }) } diff --git a/src/repository/mod.rs b/src/repository/mod.rs index d6b4c6b..56bee33 100644 --- a/src/repository/mod.rs +++ b/src/repository/mod.rs @@ -240,15 +240,15 @@ impl Repository { pub fn new_text_post<'a>(&'a self, publish_key_id: ProfileKey, - latest_block: IPFSHash, + parent_blocks: Vec, text: String, time: Option) -> impl Future { - debug!("New text post under {:?}, after block {:?}", publish_key_id, latest_block); + debug!("New text post under {:?}, after blocks {:?}", publish_key_id, parent_blocks); ::repository::client::new_text_post(self.client.clone(), publish_key_id, - latest_block, + parent_blocks, text, time) } -- cgit v1.2.3