diff options
Diffstat (limited to 'examples/zot')
-rw-r--r-- | examples/zot/abook.rs | 52 | ||||
-rw-r--r-- | examples/zot/channel_stream.rs | 109 | ||||
-rw-r--r-- | examples/zot/mod.rs | 4 | ||||
-rw-r--r-- | examples/zot/network_stream.rs | 109 | ||||
-rw-r--r-- | examples/zot/xchan.rs | 41 |
5 files changed, 315 insertions, 0 deletions
diff --git a/examples/zot/abook.rs b/examples/zot/abook.rs new file mode 100644 index 0000000..bceaacc --- /dev/null +++ b/examples/zot/abook.rs @@ -0,0 +1,52 @@ +/* Example Zot API command line utility, part of zotapi. + * Copyright (C) 2018 Harald Eilertsen <haraldei@anduin.net> + * + * This program 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. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +extern crate zotapi; +extern crate serde_json; + +pub fn fetch(client: &zotapi::Client, raw: bool) { + match client.abook().fetch() { + Ok(payload) => { + if raw { + println!("{}", &payload); + } + else { + process(&payload); + } + }, + Err(e) => { + println!("{:?}", e); + } + } +} + +fn process(payload: &str) { + let data: serde_json::Value = serde_json::from_str(&payload).unwrap(); + match data { + serde_json::Value::Array(v) => { + for contact in v { + println!("{} ({}, {})", + contact["xchan_name"], + contact["xchan_addr"], + contact["xchan_network"]); + } + }, + _ => { + println!("Unexpected data:\n{}", payload); + } + }; +} diff --git a/examples/zot/channel_stream.rs b/examples/zot/channel_stream.rs new file mode 100644 index 0000000..a278244 --- /dev/null +++ b/examples/zot/channel_stream.rs @@ -0,0 +1,109 @@ +/* Example Zot API command line utility, part of zotapi. + * Copyright (C) 2018 Harald Eilertsen <haraldei@anduin.net> + * + * This program 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. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +use zotapi; + +use serde_json; +use std::iter::Iterator; + +pub fn fetch(client: &zotapi::Client, raw: bool) { + match client.channel_stream() { + Ok(payload) => { + if raw { + println!("{}", payload); + } + else { + list(&payload); + } + }, + Err(e) => { + println!("Error getting channel stream: {:?}", e); + } + } +} + +fn list(payload: &str) { + match serde_json::from_str(&payload) { + Ok(serde_json::Value::Array(v)) => { + for item in v.into_iter() { + print_item(&item); + println!("-----"); + } + }, + Ok(_) => { + println!("Wrong type returned, expected an array.") + }, + Err(e) => { + println!("Error: {}", e); + } + } +} + +fn get_str(v: &serde_json::Value) -> &str { + v.as_str().unwrap_or("") +} + +fn get_verb(item: &serde_json::Value) -> &str { + match get_str(&item["verb"]).split("/").last() { + Some("post") => "posted", + Some("like") => "liked", + Some("share") => "shared", + Some("dislike") => "disliked", + _ => "unknown verb", + } +} + +fn get_object_type(item: &serde_json::Value) -> &str { + get_str(&item["object_type"]) + .split("/") + .last() + .unwrap_or("unknown object") +} + +fn get_tags(item: &serde_json::Value) -> String { + match item["tags"] { + serde_json::Value::Array(ref v) => { + v.iter().map(|t| { + let prefix = match get_str(&t["type"]) { + "hashtag" => "#", + "forum" => "!", + "mention" => "@", + _ => "", + }; + format!("{}{}", prefix, get_str(&t["tag"])) + }).collect::<Vec<_>>().join(", ") + }, + serde_json::Value::Null => { + String::new() + }, + _ => { + String::from("invalid tags, expected array...") + } + } +} + +fn print_item(item: &serde_json::Value) { + let author = &item["author"]; + print!("{} ", get_str(&item["created"])); + print!("{} ", get_str(&author["name"])); + println!("{} a {}", get_verb(&item), get_object_type(&item)); + println!("URL: {}", get_str(&author["url"])); + println!("Proto: {}", get_str(&author["network"])); + println!("Title: {}", get_str(&item["title"])); + println!("Tags : {}", get_tags(&item)); + println!("Message:\n{}", get_str(&item["body"])); +} diff --git a/examples/zot/mod.rs b/examples/zot/mod.rs new file mode 100644 index 0000000..089a4cb --- /dev/null +++ b/examples/zot/mod.rs @@ -0,0 +1,4 @@ +pub mod abook; +pub mod channel_stream; +pub mod network_stream; +pub mod xchan; diff --git a/examples/zot/network_stream.rs b/examples/zot/network_stream.rs new file mode 100644 index 0000000..de3b12f --- /dev/null +++ b/examples/zot/network_stream.rs @@ -0,0 +1,109 @@ +/* Example Zot API command line utility, part of zotapi. + * Copyright (C) 2018 Harald Eilertsen <haraldei@anduin.net> + * + * This program 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. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +use zotapi; + +use serde_json; +use std::iter::Iterator; + +pub fn fetch(client: &zotapi::Client, raw: bool) { + match client.network_stream() { + Ok(payload) => { + if raw { + println!("{}", payload); + } + else { + list(&payload); + } + }, + Err(e) => { + println!("Error getting channel stream: {:?}", e); + } + } +} + +fn list(payload: &str) { + match serde_json::from_str(&payload) { + Ok(serde_json::Value::Array(v)) => { + for item in v.into_iter() { + print_item(&item); + println!("-----"); + } + }, + Ok(_) => { + println!("Wrong type returned, expected an array.") + }, + Err(e) => { + println!("Error: {}", e); + } + } +} + +fn get_str(v: &serde_json::Value) -> &str { + v.as_str().unwrap_or("") +} + +fn get_verb(item: &serde_json::Value) -> &str { + match get_str(&item["verb"]).split("/").last() { + Some("post") => "posted", + Some("like") => "liked", + Some("share") => "shared", + Some("dislike") => "disliked", + _ => "unknown verb", + } +} + +fn get_object_type(item: &serde_json::Value) -> &str { + get_str(&item["object_type"]) + .split("/") + .last() + .unwrap_or("unknown object") +} + +fn get_tags(item: &serde_json::Value) -> String { + match item["tags"] { + serde_json::Value::Array(ref v) => { + v.iter().map(|t| { + let prefix = match get_str(&t["type"]) { + "hashtag" => "#", + "forum" => "!", + "mention" => "@", + _ => "", + }; + format!("{}{}", prefix, get_str(&t["tag"])) + }).collect::<Vec<_>>().join(", ") + }, + serde_json::Value::Null => { + String::new() + }, + _ => { + String::from("invalid tags, expected array...") + } + } +} + +fn print_item(item: &serde_json::Value) { + let author = &item["author"]; + print!("{} ", get_str(&item["created"])); + print!("{} ", get_str(&author["name"])); + println!("{} a {}", get_verb(&item), get_object_type(&item)); + println!("URL: {}", get_str(&author["url"])); + println!("Proto: {}", get_str(&author["network"])); + println!("Title: {}", get_str(&item["title"])); + println!("Tags : {}", get_tags(&item)); + println!("Message:\n{}", get_str(&item["body"])); +} diff --git a/examples/zot/xchan.rs b/examples/zot/xchan.rs new file mode 100644 index 0000000..d37328d --- /dev/null +++ b/examples/zot/xchan.rs @@ -0,0 +1,41 @@ +/* Example Zot API command line utility, part of zotapi. + * Copyright (C) 2018 <name of copyright holder> + * + * This program 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. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +use zotapi; + +pub enum Type { + Addr, + Hash, + GUID, +} + +pub fn fetch(client: &zotapi::Client, _raw: bool, t: Type, id: &str) { + let res = match t { + Type::Addr => client.xchan().by_address(&id).fetch(), + Type::Hash => client.xchan().by_hash(&id).fetch(), + Type::GUID => client.xchan().by_guid(&id).fetch(), + }; + + match res { + Ok(payload) => { + println!("{}", payload); + }, + Err(e) => { + println!("{:?}", e); + } + } +} |