Lingara Lingara 說明文件 學習指南 API 函式庫 應用程式 起造 網頁版
語言: 閩南語

Rust

這頁是對英文翻譯過來的。若兩篇無仝,以英文頁為準。 看英文頁

Rust 函式庫是 crates.io 頂面的 lingara crate。伊愛 Rust 1.87 抑是較新的版本,佇 Tokio 執行環境頂面行。TLS 預設由 rustls 提供,嘛會當透過一个 feature 改用平台家己的 TLS。

用起來按怎

  • 逐个呼叫攏是一个 async fn,回傳 Result。想欲取消呼叫,就共伊的 future 放掉;想欲取消串流,就共彼个串流放掉。
  • 回應標頭一到,串流就綴咧到,形式是一个由結果組成的 Stream。用 .next().await 來讀伊。
  • 錯誤是一个有四个變體的 Error 列舉。若 API 講明愛等偌久,Error::retry_after 就會回傳彼个時間。
  • 用 Client::builder() 來建構用戶端。想欲共用連線池,會當共你家己的 reqwest::Client 交予伊,毋過毋通替彼个用戶端設總逾時,若無伊會共長的串流切短。想欲替單一个呼叫設截止時間,就用 tokio::time::timeout 共伊包起來。

下面的範例會安裝 crate、建立用戶端、用串流提一份詞彙清單,閣處理錯誤。

Rust

cargo add lingara@0.1.0-alpha.6
cargo add tokio --features macros,rt-multi-thread

Rust

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()),
}

這頁包的內容