Rust
این صفحه از انگلیسی ترجمه شده است. اگر این دو با هم تفاوت داشته باشند، صفحهٔ انگلیسی درست است. خواندن صفحهٔ انگلیسی
کتابخانه Rust همان کریت lingara در crates.io است. به Rust 1.87 یا بالاتر نیاز دارد و روی محیط اجرای Tokio کار میکند. TLS بهطور پیشفرض از rustls میآید، یا از طریق یک ویژگی اختیاری از TLS خود سکو.
در عمل چگونه است
- هر فراخوانی یک
async fnاست کهResultبرمیگرداند. برای لغو یک فراخوانی، future آن را رها کنید؛ برای لغو یک جریان، خود جریان را رها کنید. - جریان به محض رسیدن سرآیندهای پاسخ میرسد، به شکل یک
Streamاز نتایج. آن را با.next().awaitبخوانید. - خطاها یک enum واحد به نام
Errorبا چهار حالتاند.Error::retry_afterمدت انتظاری را که API اعلام کرده، اگر وجود داشته باشد، برمیگرداند. - کلاینت را با
Client::builder()بسازید. برای اشتراک یک مخزن اتصال،reqwest::Clientخودتان را به آن بدهید، اما به آن کلاینت هیچ مهلت کلی ندهید، وگرنه جریانهای طولانی را نیمهکاره قطع میکند. برای تعیین مهلت یک فراخوانی، آن را درونtokio::time::timeoutبپیچید.
نمونههای زیر کریت را نصب میکنند، یک کلاینت میسازند، فهرستی از واژگان را جریانی دریافت میکنند و یک خطا را مدیریت میکنند.
Rust
cargo add lingara@0.1.0-alpha.6
cargo add tokio --features macros,rt-multi-threadRust
use lingara::Client;
let client = Client::builder()
.client_credentials(std::env::var("LINGARA_CLIENT_ID")?, std::env::var("LINGARA_CLIENT_SECRET")?)
.build()?;Rust
use lingara::models::{GenerateVocabularyEvent, VocabRequest};
use std::num::NonZeroU8;
let request = VocabRequest { level: 2, source_lang: "en".into(), target_lang: "zh".into(), count: NonZeroU8::new(8) };
let mut stream = client.generate_vocabulary(&request).await?;
while let Some(event) = stream.next().await {
if let GenerateVocabularyEvent::Item(item) = event? {
println!("{} {}", item.word, item.translation);
}
}Rust
use lingara::Error;
let result = client.get_usage().await;
if let Some(wait) = result.as_ref().err().and_then(Error::retry_after) {
eprintln!("the API asks you to retry after {wait:?}");
}
match result {
Ok(usage) => println!("{} allowance rows", usage.allowance.len()),
// A refusal from the API: status, code (stable) and message (localised).
Err(Error::Api(e)) => eprintln!("{} {} {}", e.status, e.code, e.message),
// The token endpoint refused the credentials or the scopes.
Err(Error::OAuth(e)) => eprintln!("{} {} {}", e.status, e.error, e.description.unwrap_or_default()),
Err(Error::Maintenance(_)) => eprintln!("the API is under maintenance"),
// No usable answer: connect, tls, reset, timeout, and so on.
Err(Error::Transport(e)) => eprintln!("transport: {}", e.kind),
Err(other) => return Err(other.into()),
}