Rust
Cette page est traduite de l'anglais. En cas de différence, la page anglaise fait foi. Lire la page en anglais
La bibliothèque Rust est le crate lingara sur crates.io. Elle nécessite Rust 1.87 ou version ultérieure et s’exécute sur le runtime Tokio. Le TLS est fourni par défaut par rustls, ou par le TLS natif de la plateforme via une fonctionnalité.
À quoi elle ressemble
- Chaque appel est une
async fnqui renvoie unResult. Pour annuler un appel, abandonnez sa future ; pour annuler un flux, abandonnez le flux. - Un flux arrive dès que les en-têtes de réponse arrivent, sous la forme d’un
Streamde résultats. Lisez-le avec.next().await. - Les erreurs forment une seule énumération
Errorà quatre variantes.Error::retry_afterrenvoie le délai indiqué par l’API, lorsqu’il y en a un. - Construisez un client avec
Client::builder(). Pour partager un pool de connexions, passez-lui votre proprereqwest::Client, mais sans délai total, sinon il coupera prématurément les longs flux. Pour fixer une échéance à un seul appel, enveloppez-le danstokio::time::timeout.
Les exemples ci-dessous installent le crate, créent un client, diffusent une liste de vocabulaire et gèrent une erreur.
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()),
}