Lingara Lingara Documentation Guides API Bibliothèques Applications Créer Application web
Langue: Français

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 fn qui renvoie un Result. 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 Stream de résultats. Lisez-le avec .next().await.
  • Les erreurs forment une seule énumération Error à quatre variantes. Error::retry_after renvoie 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 propre reqwest::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 dans tokio::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-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()),
}

Ce que cette page encapsule