diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2018-10-21 14:54:08 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2018-10-21 14:54:29 +0200 |
commit | 9aea381f940ae85eddd10a892752a0fe87d81da9 (patch) | |
tree | 7b96982ca325fc603bc14812116b564c3492d943 | |
parent | 0e83b1facebe03e75fa3090ef6351349c076b7f7 (diff) |
Add support for multiple parent blocks when posting
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | src/cli_ui.rs | 10 | ||||
-rw-r--r-- | src/main.rs | 10 | ||||
-rw-r--r-- | src/repository/client.rs | 38 | ||||
-rw-r--r-- | src/repository/mod.rs | 6 |
5 files changed, 39 insertions, 26 deletions
@@ -30,3 +30,4 @@ env_logger = "0.5" config = "0.9" toml = "0.4" hyper = "0.12" +itertools = "0.7" 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::<Vec<_>>(); 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<IpfsClient>, pub fn new_text_post(client: Arc<IpfsClient>, publish_key_id: ProfileKey, - latest_block: IPFSHash, + parent_blocks: Vec<IPFSHash>, text: String, time: Option<NaiveDateTime>) -> impl Future<Item = IPFSHash, Error = Error> { - 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<IpfsClient>, 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<IPFSHash>, text: String, time: Option<NaiveDateTime>) -> impl Future<Item = IPFSHash, Error = Error> { - 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) } |