Skip to main content

dingtalk_sdk/
lib.rs

1#![cfg_attr(docsrs, feature(doc_cfg))]
2#![forbid(unsafe_code)]
3#![warn(missing_docs, rustdoc::broken_intra_doc_links)]
4//! DingTalk API SDK for Rust.
5//!
6//! This crate provides:
7//! - async client (`Client`) and services (`WebhookService`, `EnterpriseService`)
8//! - optional blocking client (`BlockingClient`) and services
9//! - typed request/response models for contacts and approvals
10//! - unified error model and transport profiles/retry integration via `reqx`
11//!
12//! # Quick Start (Async)
13//!
14//! ```no_run
15//! #[cfg(feature = "_async")]
16//! use dingtalk_sdk::Client;
17//!
18//! #[cfg(feature = "_async")]
19//! #[tokio::main]
20//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
21//!     let client = Client::builder().build()?;
22//!     let webhook = client.webhook("your_token", Some("your_secret".into()));
23//!     let _ = webhook
24//!         .send_text_message("Hello from rustdoc", None, None, Some(false))
25//!         .await?;
26//!     Ok(())
27//! }
28//!
29//! #[cfg(not(feature = "_async"))]
30//! fn main() {}
31//! ```
32//!
33//! # Feature Overview
34//!
35//! At least one runtime mode is required:
36//! - `_async` (internal)
37//! - `_blocking` (internal)
38//!
39//! Each enabled runtime mode requires exactly one TLS backend:
40//! - async: `async-tls-rustls-ring` / `async-tls-rustls-aws-lc-rs` / `async-tls-native`
41//! - blocking: `blocking-tls-rustls-ring` / `blocking-tls-rustls-aws-lc-rs` / `blocking-tls-native`
42//!
43//! In normal usage, select TLS features directly. They automatically enable the
44//! matching runtime mode.
45
46// Require at least one client mode.
47#[cfg(not(any(feature = "_async", feature = "_blocking")))]
48compile_error!(
49    "Enable at least one transport feature: \
50     `async-tls-rustls-ring`, `async-tls-rustls-aws-lc-rs`, `async-tls-native`, \
51     `blocking-tls-rustls-ring`, `blocking-tls-rustls-aws-lc-rs`, or `blocking-tls-native`."
52);
53
54// Async mode requires exactly one async TLS backend.
55#[cfg(all(
56    feature = "_async",
57    not(any(
58        feature = "async-tls-rustls-ring",
59        feature = "async-tls-rustls-aws-lc-rs",
60        feature = "async-tls-native"
61    ))
62))]
63compile_error!(
64    "When `_async` is enabled, enable one async TLS backend: \
65     `async-tls-rustls-ring`, `async-tls-rustls-aws-lc-rs`, or `async-tls-native`."
66);
67#[cfg(all(
68    feature = "async-tls-rustls-ring",
69    feature = "async-tls-rustls-aws-lc-rs"
70))]
71compile_error!("`async-tls-rustls-ring` and `async-tls-rustls-aws-lc-rs` are mutually exclusive.");
72#[cfg(all(feature = "async-tls-rustls-ring", feature = "async-tls-native"))]
73compile_error!("`async-tls-rustls-ring` and `async-tls-native` are mutually exclusive.");
74#[cfg(all(feature = "async-tls-rustls-aws-lc-rs", feature = "async-tls-native"))]
75compile_error!("`async-tls-rustls-aws-lc-rs` and `async-tls-native` are mutually exclusive.");
76#[cfg(all(
77    not(feature = "_async"),
78    any(
79        feature = "async-tls-rustls-ring",
80        feature = "async-tls-rustls-aws-lc-rs",
81        feature = "async-tls-native"
82    )
83))]
84compile_error!("Async TLS features require enabling `_async`.");
85
86// Blocking mode requires exactly one blocking TLS backend.
87#[cfg(all(
88    feature = "_blocking",
89    not(any(
90        feature = "blocking-tls-rustls-ring",
91        feature = "blocking-tls-rustls-aws-lc-rs",
92        feature = "blocking-tls-native"
93    ))
94))]
95compile_error!(
96    "When `_blocking` is enabled, enable one blocking TLS backend: \
97     `blocking-tls-rustls-ring`, `blocking-tls-rustls-aws-lc-rs`, or `blocking-tls-native`."
98);
99#[cfg(all(
100    feature = "blocking-tls-rustls-ring",
101    feature = "blocking-tls-rustls-aws-lc-rs"
102))]
103compile_error!(
104    "`blocking-tls-rustls-ring` and `blocking-tls-rustls-aws-lc-rs` are mutually exclusive."
105);
106#[cfg(all(feature = "blocking-tls-rustls-ring", feature = "blocking-tls-native"))]
107compile_error!("`blocking-tls-rustls-ring` and `blocking-tls-native` are mutually exclusive.");
108#[cfg(all(
109    feature = "blocking-tls-rustls-aws-lc-rs",
110    feature = "blocking-tls-native"
111))]
112compile_error!("`blocking-tls-rustls-aws-lc-rs` and `blocking-tls-native` are mutually exclusive.");
113#[cfg(all(
114    not(feature = "_blocking"),
115    any(
116        feature = "blocking-tls-rustls-ring",
117        feature = "blocking-tls-rustls-aws-lc-rs",
118        feature = "blocking-tls-native"
119    )
120))]
121compile_error!("Blocking TLS features require enabling `_blocking`.");
122
123mod api;
124mod auth;
125mod client;
126mod error;
127mod signature;
128mod transport;
129mod types;
130mod util;
131
132#[cfg(feature = "_blocking")]
133#[cfg_attr(docsrs, doc(cfg(feature = "_blocking")))]
134pub use api::{BlockingEnterpriseService, BlockingWebhookService};
135#[cfg(feature = "_async")]
136#[cfg_attr(docsrs, doc(cfg(feature = "_async")))]
137pub use api::{EnterpriseService, WebhookService};
138#[cfg(feature = "_async")]
139#[cfg_attr(docsrs, doc(cfg(feature = "_async")))]
140pub use client::async_client::{Client, ClientBuilder};
141#[cfg(feature = "_blocking")]
142#[cfg_attr(docsrs, doc(cfg(feature = "_blocking")))]
143pub use client::blocking_client::{BlockingClient, BlockingClientBuilder};
144
145#[cfg(feature = "_blocking")]
146#[cfg_attr(docsrs, doc(cfg(feature = "_blocking")))]
147/// Blocking runtime service aliases.
148pub mod blocking {
149    pub use crate::{
150        BlockingEnterpriseService as EnterpriseService, BlockingWebhookService as WebhookService,
151    };
152}
153
154/// Application credentials used by enterprise APIs.
155pub use auth::AppCredentials;
156/// SDK error type and helpers.
157pub use error::{Error, ErrorKind, HttpError, Result, TransportError};
158/// reqx transport profile presets for DingTalk clients.
159pub use reqx::advanced::ClientProfile;
160/// reqx retry policy for DingTalk clients.
161pub use reqx::prelude::RetryPolicy;
162/// Controls whether and how response snippets are retained in errors.
163pub use transport::BodySnippetConfig;
164/// Public webhook and enterprise request/response helper types.
165pub use types::{
166    ActionCardButton, ApprovalCreateProcessInstanceRequest, ApprovalFormComponentValue,
167    ApprovalListProcessInstanceIdsRequest, ApprovalListProcessInstanceIdsResult,
168    ApprovalProcessInstance, ApprovalTerminateProcessInstanceRequest,
169    ContactCreateDepartmentRequest, ContactCreateDepartmentResult, ContactCreateUserRequest,
170    ContactCreateUserResult, ContactDeleteDepartmentRequest, ContactDeleteUserRequest,
171    ContactDepartment, ContactGetDepartmentRequest, ContactGetUserByMobileRequest,
172    ContactGetUserByUnionIdRequest, ContactGetUserRequest, ContactListSubDepartmentIdsRequest,
173    ContactListSubDepartmentIdsResult, ContactListSubDepartmentsRequest,
174    ContactListSubDepartmentsResult, ContactListUsersRequest, ContactListUsersResult,
175    ContactUpdateDepartmentRequest, ContactUpdateUserRequest, ContactUser, FeedCardLink,
176};