diff options
author | Harald Eilertsen <haraldei@anduin.net> | 2023-03-29 13:08:09 +0200 |
---|---|---|
committer | Harald Eilertsen <haraldei@anduin.net> | 2023-03-29 13:08:09 +0200 |
commit | 8100cff32bf0c87dc19fba78f3faac8090f863da (patch) | |
tree | 7c6315dbb83162b8d91aae53b920c2e7f20a4268 /src/bin/zot/zot/channel_stream.rs | |
parent | a4b9520f430ce188ba9165dcabd3320763ff2e16 (diff) | |
download | rust-zotapi-8100cff32bf0c87dc19fba78f3faac8090f863da.tar.gz rust-zotapi-8100cff32bf0c87dc19fba78f3faac8090f863da.tar.bz2 rust-zotapi-8100cff32bf0c87dc19fba78f3faac8090f863da.zip |
Another reqrite...
Third time must be where it sits I hope.
I felt the API was getting a bit too distracted by unnecessary
constructs and abstractions, so I'm trying to simplify it by making it
more straight forward.
The idea now is to have one main API class (ZotApi), and all the various
remote API's as public methods on this basic class. Iow, the ZotApi
class is mainly based on the existing `Client` class, which is then
being phased out.
And instead of having each API tied to the data type they return, I'm
just adding methods that will return the respective data types. This
should reduce coupling between the returned data, and the API calls
themselves.
Diffstat (limited to 'src/bin/zot/zot/channel_stream.rs')
-rw-r--r-- | src/bin/zot/zot/channel_stream.rs | 113 |
1 files changed, 0 insertions, 113 deletions
diff --git a/src/bin/zot/zot/channel_stream.rs b/src/bin/zot/zot/channel_stream.rs deleted file mode 100644 index 68a5402..0000000 --- a/src/bin/zot/zot/channel_stream.rs +++ /dev/null @@ -1,113 +0,0 @@ -/* 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 async fn fetch(client: &zotapi::Client, raw: bool) { - match zotapi::channel_stream().fetch(&client).await { - 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); - } - } - 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"]; - - println!("{} {} {} a {}:", - get_str(&item["created"]), - get_str(&author["name"]), - get_verb(&item), - get_object_type(&item)); - - let title = get_str(&item["title"]); - if title.len() > 0 { - println!("Title: {}", get_str(&item["title"])); - } - - let tags = get_tags(&item); - if tags.len() > 0 { - println!("Tags : {}", get_tags(&item)); - } - - println!("\n{}\n", get_str(&item["body"])); -} |