Lingara Lingara 문서 학습 가이드 API 라이브러리 앱 만들기 웹 앱
언어: 한국어

Rust

이 페이지는 영어에서 번역되었습니다. 두 내용이 다를 경우 영어 페이지가 정확합니다. 영어 페이지 읽기

Rust 라이브러리는 crates.io의 lingara 크레이트입니다. Rust 1.87 이상이 필요하며 Tokio 런타임에서 실행됩니다. TLS는 기본적으로 rustls를 사용하며, 기능 플래그를 켜면 플랫폼 자체의 TLS를 사용할 수도 있습니다.

사용 방식

  • 모든 호출은 async fn이며 Result를 반환합니다. 호출을 취소하려면 그 future를 drop하고, 스트림을 취소하려면 스트림을 drop하세요.
  • 스트림은 응답 헤더가 도착하는 즉시 결과의 Stream으로 전달됩니다. .next().await로 읽습니다.
  • 오류는 네 가지 변형을 가진 하나의 Error 열거형입니다. API가 대기 시간을 알려 준 경우 Error::retry_after가 그 시간을 반환합니다.
  • 클라이언트는 Client::builder()로 만듭니다. 커넥션 풀을 공유하려면 직접 만든 reqwest::Client를 넘기되, 그 클라이언트에는 전체 제한 시간을 설정하지 마세요. 설정하면 긴 스트림이 중간에 끊깁니다. 한 호출에 기한을 두려면 tokio::time::timeout으로 감싸세요.

아래 샘플은 크레이트를 설치하고, 클라이언트를 만들고, 어휘 목록을 스트리밍하고, 오류를 처리합니다.

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

이 페이지가 감싸는 것