From 0bb8446969238eb85931c4ae57ccf408b134b76e Mon Sep 17 00:00:00 2001 From: ZoOL Date: Tue, 25 Jun 2024 16:47:20 +0800 Subject: [PATCH] add ci --- .github/workflows/ci.yml | 81 ++++++++++++++++++++++ examples/ws_client.rs | 16 +++-- src/event/dispatcher/im_v1_event.rs | 21 ------ src/event/dispatcher/mod.rs | 38 +++++++++- src/service/im/v1.rs | 1 + src/service/im/v1/p2_im_message_read_v1.rs | 47 +++++++++++++ 6 files changed, 176 insertions(+), 28 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 src/event/dispatcher/im_v1_event.rs create mode 100644 src/service/im/v1/p2_im_message_read_v1.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0e7e3e9 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,81 @@ +# Based on https://github.com/actions-rs/meta/blob/master/recipes/quickstart.md + +on: + push: + branches: [main] + pull_request: + branches: [main] + +name: Continuous Integration + +jobs: + check: + name: Run cargo check + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Run cargo check + run: cargo check --all-targets + + - name: Run cargo check with atlas feature + run: cargo check --all-targets --features atlas + + - name: Run cargo check headless + run: cargo check --all-targets --no-default-features + + docs: + name: Run cargo doc + env: + RUSTDOCFLAGS: -D warnings + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Run cargo doc + run: cargo doc --all-features --no-deps + + build_examples: + name: Build examples + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Build examples + run: cargo build --examples + + - name: Clean + run: cargo clean + + - name: Build examples with atlas feature + run: cargo build --examples --features atlas + + test: + name: Tests + strategy: + # Tests are most likely to have OS-specific behavior + matrix: + os: [ubuntu-latest, windows-latest, macOS-latest] + + runs-on: ${{ matrix.os }} + steps: + - name: Checkout sources + uses: actions/checkout@v3 + + - name: Install stable toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Run cargo test + run: cargo test \ No newline at end of file diff --git a/examples/ws_client.rs b/examples/ws_client.rs index 4892d2b..403bafb 100644 --- a/examples/ws_client.rs +++ b/examples/ws_client.rs @@ -4,8 +4,11 @@ use dotenvy::dotenv; use log::info; use open_lark::{ - client::ws_client::LarkWsClient, event::dispatcher::EventDispatcherHandler, - service::im::v1::p2_im_message_receive_v1::P2ImMessageReceiveV1, + client::ws_client::LarkWsClient, + event::dispatcher::EventDispatcherHandler, + service::im::v1::{ + p2_im_message_read_v1::P2ImMessageReadV1, p2_im_message_receive_v1::P2ImMessageReceiveV1, + }, }; #[tokio::main] @@ -16,7 +19,8 @@ async fn main() { let app_secret = env::var("APP_SECRET").unwrap(); let event_handler = EventDispatcherHandler::builder() - .register_p2_im_message_receive_v1(Box::new(handle_p2_im_message_receive_v1)) + .register_p2_im_message_receive_v1(handle_p2_im_message_receive_v1) + .register_p2_im_message_read_v1(handle_p2_im_message_read_v1) .build(); LarkWsClient::open(&app_id, &app_secret, event_handler) @@ -25,5 +29,9 @@ async fn main() { } fn handle_p2_im_message_receive_v1(data: P2ImMessageReceiveV1) { - info!("receive message: {:?}", data); + info!("p2.im.message.receive_v1: {:?}", data); +} + +fn handle_p2_im_message_read_v1(data: P2ImMessageReadV1) { + info!("p2.im.message.message_read_v1: {:?}", data); } diff --git a/src/event/dispatcher/im_v1_event.rs b/src/event/dispatcher/im_v1_event.rs deleted file mode 100644 index 09bbadf..0000000 --- a/src/event/dispatcher/im_v1_event.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::{ - event::dispatcher::EventDispatcherHandlerBuilder, - service::im::v1::p2_im_message_receive_v1::{ - P2ImMessageReceiveV1, P2ImMessageReceiveV1ProcessorImpl, - }, -}; - -impl EventDispatcherHandlerBuilder { - pub fn register_p2_im_message_receive_v1(mut self, f: F) -> Self - where - F: Fn(P2ImMessageReceiveV1) + 'static + Sync + Send, - { - let key = "p2.im.message.receive_v1".to_string(); - if self.processor_map.contains_key(&key) { - panic!("processor already registered, type: {}", key); - } - let processor = P2ImMessageReceiveV1ProcessorImpl::new(f); - self.processor_map.insert(key, Box::new(processor)); - self - } -} diff --git a/src/event/dispatcher/mod.rs b/src/event/dispatcher/mod.rs index 4f54eef..11ab32a 100644 --- a/src/event/dispatcher/mod.rs +++ b/src/event/dispatcher/mod.rs @@ -1,8 +1,12 @@ use std::collections::HashMap; -use crate::event::context::EventContext; - -mod im_v1_event; +use crate::{ + event::context::EventContext, + service::im::v1::p2_im_message_receive_v1::{ + P2ImMessageReceiveV1, P2ImMessageReceiveV1ProcessorImpl, + }, +}; +use crate::service::im::v1::p2_im_message_read_v1::{P2ImMessageReadV1, P2ImMessageReadV1ProcessorImpl}; /// 事件分发处理器 pub struct EventDispatcherHandler { @@ -77,3 +81,31 @@ impl EventDispatcherHandlerBuilder { } } } + +impl EventDispatcherHandlerBuilder { + pub fn register_p2_im_message_receive_v1(mut self, f: F) -> Self + where + F: Fn(P2ImMessageReceiveV1) + 'static + Sync + Send, + { + let key = "p2.im.message.receive_v1".to_string(); + if self.processor_map.contains_key(&key) { + panic!("processor already registered, type: {}", key); + } + let processor = P2ImMessageReceiveV1ProcessorImpl::new(f); + self.processor_map.insert(key, Box::new(processor)); + self + } + + pub fn register_p2_im_message_read_v1(mut self, f: F) -> Self + where + F: Fn(P2ImMessageReadV1) + 'static + Sync + Send, + { + let key = "p2.im.message.message_read_v1".to_string(); + if self.processor_map.contains_key(&key) { + panic!("processor already registered, type: {}", key); + } + let processor = P2ImMessageReadV1ProcessorImpl::new(f); + self.processor_map.insert(key, Box::new(processor)); + self + } +} diff --git a/src/service/im/v1.rs b/src/service/im/v1.rs index 3e2bb11..86c0cb6 100644 --- a/src/service/im/v1.rs +++ b/src/service/im/v1.rs @@ -6,6 +6,7 @@ use crate::{ pub mod chats; pub mod message; pub mod p2_im_message_receive_v1; +pub mod p2_im_message_read_v1; pub struct V1 { pub chats: ChatsService, diff --git a/src/service/im/v1/p2_im_message_read_v1.rs b/src/service/im/v1/p2_im_message_read_v1.rs new file mode 100644 index 0000000..cd1a9c2 --- /dev/null +++ b/src/service/im/v1/p2_im_message_read_v1.rs @@ -0,0 +1,47 @@ +use serde::{Deserialize, Serialize}; + +use crate::{ + event::{context::EventHeader, dispatcher::EventHandler}, + service::im::v1::p2_im_message_receive_v1::{EventMessage, EventSender}, +}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct P2ImMessageReadV1 { + pub schema: String, + pub header: EventHeader, + pub event: P2ImMessageMessageReadV1Data, +} + +/// 事件 +#[derive(Debug, Serialize, Deserialize)] +pub struct P2ImMessageMessageReadV1Data { + pub sender: EventSender, + pub message: EventMessage, +} + +pub struct P2ImMessageReadV1ProcessorImpl +where + F: Fn(P2ImMessageReadV1) + 'static, +{ + f: F, +} + +impl P2ImMessageReadV1ProcessorImpl +where + F: Fn(P2ImMessageReadV1) + 'static, +{ + pub fn new(f: F) -> Self { + P2ImMessageReadV1ProcessorImpl { f } + } +} + +impl EventHandler for P2ImMessageReadV1ProcessorImpl +where + F: Fn(P2ImMessageReadV1) + 'static + Sync + Send, +{ + fn handle(&self, payload: &[u8]) -> anyhow::Result<()> { + let message: P2ImMessageReadV1 = serde_json::from_slice(payload)?; + (self.f)(message); + Ok(()) + } +}