misskey_api/streaming/channel/
hashtag.rs

1use crate::model::{note::Note, query::Query};
2use crate::streaming::channel::NoOutgoing;
3
4use serde::{Deserialize, Serialize};
5
6#[derive(Deserialize, Debug, Clone)]
7#[serde(rename_all = "camelCase", tag = "type", content = "body")]
8pub enum HashtagEvent {
9    Note(Note),
10}
11
12#[derive(Serialize, Debug, Clone)]
13#[serde(rename_all = "camelCase")]
14pub struct Request {
15    pub q: Query<String>,
16}
17
18impl misskey_core::streaming::ConnectChannelRequest for Request {
19    type Incoming = HashtagEvent;
20    type Outgoing = NoOutgoing;
21
22    const NAME: &'static str = "hashtag";
23}
24
25#[cfg(test)]
26mod tests {
27    use super::Request;
28    use crate::model::query::Query;
29    use crate::test::{websocket::TestClient, ClientExt};
30
31    use futures::{future, StreamExt};
32
33    #[tokio::test]
34    async fn subscribe_unsubscribe() {
35        let client = TestClient::new().await;
36
37        let mut stream = client
38            .channel(Request {
39                q: Query(vec![vec!["tag".to_string()]]),
40            })
41            .await
42            .unwrap();
43        stream.disconnect().await.unwrap();
44    }
45
46    #[tokio::test]
47    async fn stream() {
48        let client = TestClient::new().await;
49        let mut stream = client
50            .channel(Request {
51                q: Query(vec![vec!["test".to_string(), "good".to_string()]]),
52            })
53            .await
54            .unwrap();
55
56        future::join(client.create_note(Some("#test #good"), None, None), async {
57            stream.next().await.unwrap().unwrap()
58        })
59        .await;
60    }
61}