shikicrate 0.1.1

Rust client for Shikimori GraphQL API
Documentation

Shikicrate GraphQL Client

Rust клиент для работы с GraphQL API Shikimori.

Установка

Добавь в Cargo.toml:

[dependencies]
shikicrate = "0.1.0"

Или для локальной разработки:

[dependencies]
shikicrate = { path = "../shikimori" }

Использование

Базовый пример

use shikicrate::{ShikicrateClient, queries::*};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = ShikicrateClient::new()?;
    
    // Поиск аниме
    let params = AnimeSearchParams {
        search: Some("naruto".to_string()),
        limit: Some(10),
        kind: None,
    };
    
    let animes = client.animes(params).await?;
    
    for anime in animes {
        println!("{} (ID: {})", anime.name, anime.id);
    }
    
    Ok(())
}

Поиск манги

let params = MangaSearchParams {
    limit: Some(5),
    search: Some("one piece".to_string()),
    kind: None,
};

let mangas = client.mangas(params).await?;

Поиск персонажей

// Поиск по странице
let params = CharacterSearchParams {
    page: Some(1),
    limit: Some(20),
    ids: None,
};

let characters = client.characters(params).await?;

// Поиск по ID
let params = CharacterSearchParams {
    page: None,
    limit: None,
    ids: Some(vec!["1".to_string(), "2".to_string()]),
};

let characters = client.characters(params).await?;

Поиск людей

let params = PeopleSearchParams {
    limit: Some(10),
    search: Some("miyazaki".to_string()),
};

let people = client.people(params).await?;

Поиск пользовательских оценок

let params = UserRateSearchParams {
    page: Some(1),
    limit: Some(20),
    target_type: Some("Anime".to_string()),
    order_field: Some("updated_at".to_string()),
    order: Some("desc".to_string()),
};

let user_rates = client.user_rates(params).await?;

Структура проекта

  • src/client.rs - HTTP клиент для выполнения GraphQL запросов
  • src/error.rs - Типы ошибок
  • src/types.rs - Типы данных (Anime, Manga, Character, Person и т.д.)
  • src/queries.rs - Методы для выполнения запросов
  • animes, mangas, characters, people, userrates - GraphQL запросы

Пример использования

Запусти пример приложения для проверки работоспособности:

cargo run --example test_client

Пример демонстрирует:

  • Поиск аниме с фильтрами
  • Поиск манги
  • Поиск персонажей (по странице и по ID)
  • Поиск людей
  • Вывод детальной информации

Настройка клиента

С помощью Builder

use shikicrate::ShikicrateClientBuilder;
use std::time::Duration;

let client = ShikicrateClientBuilder::new()
    .timeout(Duration::from_secs(60))
    .base_url("https://shikimori.one/api/graphql".to_string())
    .build()?;

Прямое создание

use shikicrate::ShikicrateClient;

// С настройками по умолчанию
let client = ShikicrateClient::new()?;

// С кастомным таймаутом
let client = ShikicrateClient::with_timeout(Duration::from_secs(60))?;

// С кастомным URL
let client = ShikicrateClient::with_base_url("https://api.example.com/graphql".to_string())?;

Обработка ошибок

Клиент автоматически обрабатывает:

  • Rate limiting (429): повторяет запрос с учетом заголовка Retry-After
  • Сетевые ошибки: повторяет до 3 раз с экспоненциальной задержкой
  • GraphQL ошибки: возвращает все сообщения об ошибках
  • Валидация: проверяет параметры запроса перед отправкой
use shikicrate::{ShikicrateError, Result};

match client.animes(params).await {
    Err(ShikicrateError::RateLimit { retry_after, .. }) => {
        println!("Rate limit, retry after: {:?} seconds", retry_after);
    }
    Err(ShikicrateError::Validation(msg)) => {
        println!("Validation error: {}", msg);
    }
    Ok(animes) => println!("Found {} animes", animes.len()),
    Err(e) => eprintln!("Error: {}", e),
}

Тестирование

cargo test

Лицензия

MIT OR Apache-2.0