Skip to main content

line_bot_sdk_rust/client/
mod.rs

1/*
2* Copyright 2023 nanato12
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8*     http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17//! LINE API client module.
18//!
19//! Provides the [`LINE`] struct, which bundles all LINE API clients into a single entry point.
20
21use std::sync::Arc;
22use std::time::Duration;
23
24use crate::line_channel_access_token::apis::{
25    configuration::Configuration as ChannelAccessTokenApiConfiguration, ChannelAccessTokenApiClient,
26};
27use crate::line_insight::apis::{
28    configuration::Configuration as InsightConfiguration, InsightApiClient,
29};
30use crate::line_liff::apis::{configuration::Configuration as LiffConfiguration, LiffApiClient};
31use crate::line_manage_audience::apis::{
32    configuration::Configuration as ManageAudienceConfiguration, ManageAudienceApiClient,
33    ManageAudienceBlobApiClient,
34};
35use crate::line_messaging_api::apis::{
36    configuration::Configuration as MessagingApiConfiguration, MessagingApiApiClient,
37    MessagingApiBlobApiClient,
38};
39use crate::line_module::apis::{
40    configuration::Configuration as LineModuleConfiguration, LineModuleApiClient,
41};
42use crate::line_module_attach::apis::{
43    configuration::Configuration as LineModuleAttachConfiguration, LineModuleAttachApiClient,
44};
45use crate::line_shop::apis::{configuration::Configuration as ShopConfiguration, ShopApiClient};
46use crate::line_webhook::apis::{
47    configuration::Configuration as WebhookConfiguration, DummyApiClient as WebhookDummyApiClient,
48};
49use hyper_rustls::HttpsConnector;
50use hyper_rustls::HttpsConnectorBuilder;
51use hyper_util::client::legacy::connect::HttpConnector;
52use hyper_util::client::legacy::Client;
53use hyper_util::rt::TokioExecutor;
54
55type HttpsClient = HttpsConnector<HttpConnector>;
56
57/// A unified client for all LINE Platform APIs.
58///
59/// `LINE` bundles all API-specific clients, each configured with the same channel access token
60/// and sharing a single HTTPS connection pool via `hyper`.
61///
62/// # Example
63///
64/// ```no_run
65/// use line_bot_sdk_rust::client::LINE;
66/// use line_bot_sdk_rust::line_messaging_api::apis::MessagingApiApi;
67/// use line_bot_sdk_rust::line_messaging_api::models::{
68///     Message, ReplyMessageRequest, TextMessage,
69/// };
70///
71/// # async fn example() {
72/// let line = LINE::new("YOUR_CHANNEL_ACCESS_TOKEN".to_string());
73///
74/// let req = ReplyMessageRequest {
75///     reply_token: "reply_token".to_string(),
76///     messages: vec![Message::TextMessage(TextMessage::new("Hello!".to_string()))],
77///     notification_disabled: Some(false),
78/// };
79/// let _ = line.messaging_api_client.reply_message(req).await;
80/// # }
81/// ```
82#[derive(Clone)]
83pub struct LINE {
84    pub channel_access_token_api_client: ChannelAccessTokenApiClient<HttpsClient>,
85    pub insight_api_client: InsightApiClient<HttpsClient>,
86    pub liff_api_client: LiffApiClient<HttpsClient>,
87    pub manage_audience_api_client: ManageAudienceApiClient<HttpsClient>,
88    pub manage_audience_blob_api_client: ManageAudienceBlobApiClient<HttpsClient>,
89    pub messaging_api_client: MessagingApiApiClient<HttpsClient>,
90    pub messaging_api_blob_client: MessagingApiBlobApiClient<HttpsClient>,
91    pub module_api_client: LineModuleApiClient<HttpsClient>,
92    pub module_attach_api_client: LineModuleAttachApiClient<HttpsClient>,
93    pub shop_api_client: ShopApiClient<HttpsClient>,
94    pub webhook_dummy_api_client: WebhookDummyApiClient<HttpsClient>,
95}
96
97impl LINE {
98    /// Creates a new `LINE` client with the given channel access token.
99    ///
100    /// All API-specific clients are initialized with the same token and share a single
101    /// HTTPS connection via `hyper` + `hyper-rustls`.
102    pub fn new(token: String) -> LINE {
103        LINEBuilder {
104            token,
105            timeout: None,
106        }
107        .build()
108    }
109
110    /// Returns a [`LINEBuilder`] for constructing a `LINE` client with custom settings.
111    ///
112    /// # Example
113    ///
114    /// ```no_run
115    /// use std::time::Duration;
116    /// use line_bot_sdk_rust::client::LINE;
117    ///
118    /// let line = LINE::builder("YOUR_CHANNEL_ACCESS_TOKEN".to_string())
119    ///     .timeout(Duration::from_secs(30))
120    ///     .build();
121    /// ```
122    pub fn builder(token: String) -> LINEBuilder {
123        LINEBuilder {
124            token,
125            timeout: None,
126        }
127    }
128
129    fn create_hyper_client() -> Client<HttpsClient, String> {
130        let https = HttpsConnectorBuilder::new()
131            .with_native_roots()
132            .expect("no native root certs found")
133            .https_only()
134            .enable_http1()
135            .build();
136        Client::builder(TokioExecutor::new()).build(https)
137    }
138}
139
140/// Builder for configuring a [`LINE`] client.
141///
142/// Obtained via [`LINE::builder`].
143pub struct LINEBuilder {
144    token: String,
145    timeout: Option<Duration>,
146}
147
148impl LINEBuilder {
149    /// Sets the request timeout for all API calls.
150    ///
151    /// When set, each HTTP request will fail with a timeout error if it does not
152    /// complete within the specified duration. By default there is no timeout.
153    pub fn timeout(mut self, duration: Duration) -> Self {
154        self.timeout = Some(duration);
155        self
156    }
157
158    /// Builds the [`LINE`] client with the configured settings.
159    pub fn build(self) -> LINE {
160        let client = LINE::create_hyper_client();
161        let timeout = self.timeout;
162        let token = self.token;
163
164        // channel_access_token_api
165        let mut channel_access_token_api_conf =
166            ChannelAccessTokenApiConfiguration::with_client(client.clone());
167        channel_access_token_api_conf.oauth_access_token = Some(token.to_owned());
168        channel_access_token_api_conf.timeout = timeout;
169        let channel_access_token_api_client =
170            ChannelAccessTokenApiClient::new(Arc::new(channel_access_token_api_conf));
171
172        // insight
173        let mut insight_conf = InsightConfiguration::with_client(client.clone());
174        insight_conf.oauth_access_token = Some(token.to_owned());
175        insight_conf.timeout = timeout;
176        let insight_api_client = InsightApiClient::new(Arc::new(insight_conf));
177
178        // liff
179        let mut liff_conf = LiffConfiguration::with_client(client.clone());
180        liff_conf.oauth_access_token = Some(token.to_owned());
181        liff_conf.timeout = timeout;
182        let liff_api_client = LiffApiClient::new(Arc::new(liff_conf));
183
184        // manage_audience
185        let mut manage_audience_conf = ManageAudienceConfiguration::with_client(client.clone());
186        manage_audience_conf.oauth_access_token = Some(token.to_owned());
187        manage_audience_conf.timeout = timeout;
188        let manage_audience_api_client =
189            ManageAudienceApiClient::new(Arc::new(manage_audience_conf));
190
191        // manage_audience_blob
192        let mut manage_audience_blob_conf =
193            ManageAudienceConfiguration::with_client(client.clone());
194        manage_audience_blob_conf.oauth_access_token = Some(token.to_owned());
195        manage_audience_blob_conf.timeout = timeout;
196        let manage_audience_blob_api_client =
197            ManageAudienceBlobApiClient::new(Arc::new(manage_audience_blob_conf));
198
199        // messaging_api
200        let mut messaging_api_conf = MessagingApiConfiguration::with_client(client.clone());
201        messaging_api_conf.oauth_access_token = Some(token.to_owned());
202        messaging_api_conf.timeout = timeout;
203        let messaging_api_client = MessagingApiApiClient::new(Arc::new(messaging_api_conf));
204
205        // messaging_api_blob
206        let mut messaging_api_blob_conf = MessagingApiConfiguration::with_client(client.clone());
207        messaging_api_blob_conf.oauth_access_token = Some(token.to_owned());
208        messaging_api_blob_conf.timeout = timeout;
209        let messaging_api_blob_client =
210            MessagingApiBlobApiClient::new(Arc::new(messaging_api_blob_conf));
211
212        // module
213        let mut module_conf = LineModuleConfiguration::with_client(client.clone());
214        module_conf.oauth_access_token = Some(token.to_owned());
215        module_conf.timeout = timeout;
216        let module_api_client = LineModuleApiClient::new(Arc::new(module_conf));
217
218        // module_attach
219        let mut module_attach_conf = LineModuleAttachConfiguration::with_client(client.clone());
220        module_attach_conf.oauth_access_token = Some(token.to_owned());
221        module_attach_conf.timeout = timeout;
222        let module_attach_api_client = LineModuleAttachApiClient::new(Arc::new(module_attach_conf));
223
224        // shop
225        let mut shop_conf = ShopConfiguration::with_client(client.clone());
226        shop_conf.oauth_access_token = Some(token.to_owned());
227        shop_conf.timeout = timeout;
228        let shop_api_client = ShopApiClient::new(Arc::new(shop_conf));
229
230        // webhook
231        let mut webhook_conf = WebhookConfiguration::with_client(client.clone());
232        webhook_conf.oauth_access_token = Some(token.to_owned());
233        webhook_conf.timeout = timeout;
234        let webhook_dummy_api_client = WebhookDummyApiClient::new(Arc::new(webhook_conf));
235
236        LINE {
237            channel_access_token_api_client,
238            insight_api_client,
239            liff_api_client,
240            manage_audience_api_client,
241            manage_audience_blob_api_client,
242            messaging_api_client,
243            messaging_api_blob_client,
244            module_api_client,
245            module_attach_api_client,
246            shop_api_client,
247            webhook_dummy_api_client,
248        }
249    }
250}