timeline
timeline
コマンドの追加はできましたか。
ここでは追加できた前提で話をします。
今のままではすごく見づらいですよね。これを形成して表示する必要が出てきます。
今回は、出力結果を形成する方法の紹介です。
src/data.rs
#[derive(Serialize, Deserialize)]
pub struct Timeline {
pub feed: Vec<Feed>
}
#[derive(Serialize, Deserialize)]
#[allow(non_snake_case)]
pub struct Feed {
pub post: Post,
}
#[derive(Serialize, Deserialize)]
#[allow(non_snake_case)]
pub struct Post {
pub did: Option<String>,
pub uri: String,
pub cid: String,
pub collection: Option<String>,
pub record: Record,
pub author: Author,
pub reason: Option<String>,
pub indexedAt: String,
pub replyCount: i32,
pub postCount: Option<i32>,
pub repostCount: i32,
pub likeCount: i32,
}
#[derive(Serialize, Deserialize)]
#[allow(non_snake_case)]
pub struct Record {
pub text: Option<String>,
pub createdAt: String,
}
#[derive(Serialize, Deserialize)]
#[allow(non_snake_case)]
pub struct Author {
pub did: String,
//pub declaration: Declaration,
pub description: Option<String>,
pub displayName: Option<String>,
pub handle: String,
pub avatar: Option<String>,
pub viewer: Viewer,
pub labels: Labels,
}
rustで最も厄介なのがstruct
と呼ばれるデータ構造体を用意しなければならないことです。これは出力結果やopenapi
からコードを自動生成できますが、今回は手動で書いています。
src/main.rs
use crate::data::Timeline;
fn timeline() {
let h = async {
let j = timeline::get_request().await;
let timeline: Timeline = serde_json::from_str(&j).unwrap();
let n = timeline.feed;
let length = &n.len();
for i in 0..*length {
println!("@{}", n[i].post.author.handle);
if ! n[i].post.record.text.is_none() {
println!("{}", n[i].post.record.text.as_ref().unwrap());
}
//println!("uri : {}", n[i].post.uri);
//println!("cid : {}", n[i].post.cid);
println!("⚡️ [{}]\t🌈 [{}]\t⭐️ [{}]", n[i].post.replyCount,n[i].post.repostCount, n[i].post.likeCount);
println!("{}", "---------");
}
};
let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
return res
}
fn c_timeline(_c: &Context) {
access_token().unwrap();
timeline();
}
できました。これで見やすいように出力結果が形成されます。
$ cargo build
$ ./target/debug/ai t
@yui.syui.ai
hello world
⚡️ [1] 🌈 [1] ⭐️ [0]
---------