lark-channel 0.5.0

Lark/Feishu Channel SDK for Rust
Documentation
use std::env;
use std::io;

use lark_channel::lark_openapi::{MessageCreateOptions, OpenApiClient, ReqwestOpenApiTransport};
use lark_channel::{ChannelConfig, MessageContent, Recipient};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = ChannelConfig::new(
        required_env("LARK_APP_ID")?,
        required_env("LARK_APP_SECRET")?,
    );
    let client = OpenApiClient::new(config, ReqwestOpenApiTransport::new());

    let recipient = recipient_from_env()?;
    let text = env::var("LARK_TEXT").unwrap_or_else(|_| "hello from lark-channel".to_owned());
    let options = create_options_from_env();
    let message_id = client
        .create_message_with_options(recipient, MessageContent::Text { text }, options)
        .await?;

    println!("message sent: {}", message_id.0);

    Ok(())
}

fn create_options_from_env() -> MessageCreateOptions {
    let mut options = MessageCreateOptions::new();
    if let Ok(uuid) = env::var("LARK_UUID") {
        options = options.uuid(uuid);
    }
    options
}

fn recipient_from_env() -> Result<Recipient, io::Error> {
    if let Ok(chat_id) = env::var("LARK_CHAT_ID") {
        return Ok(Recipient::Chat(chat_id));
    }
    if let Ok(open_id) = env::var("LARK_OPEN_ID") {
        return Ok(Recipient::User(open_id));
    }

    Err(io::Error::new(
        io::ErrorKind::NotFound,
        "missing required environment variable: LARK_CHAT_ID or LARK_OPEN_ID",
    ))
}

fn required_env(name: &str) -> Result<String, io::Error> {
    env::var(name).map_err(|_| {
        io::Error::new(
            io::ErrorKind::NotFound,
            format!("missing required environment variable: {name}"),
        )
    })
}