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]
---------

results matching ""

    No results matching ""