misskey_api/streaming/channel/
hashtag.rs1use 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}