summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml1
-rw-r--r--src/cli_ui.rs10
-rw-r--r--src/main.rs10
-rw-r--r--src/repository/client.rs38
-rw-r--r--src/repository/mod.rs6
5 files changed, 39 insertions, 26 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 9e3371c..1853f49 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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)
}