shikicrate 0.2.1

Rust client for Shikimori GraphQL API
Documentation
use shikicrate::{ShikicrateClient, queries::*};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("πŸš€ ВСстированиС Shikicrate GraphQL ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°\n");

    let client = ShikicrateClient::new()?;

    // ВСст 1: Поиск Π°Π½ΠΈΠΌΠ΅
    println!("πŸ“Ί ВСст 1: Поиск Π°Π½ΠΈΠΌΠ΅");
    println!("Поиск: 'bakemono', Π»ΠΈΠΌΠΈΡ‚: 3, ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡΠΏΠ΅ΡˆΠ»Ρ‹\n");

    let animes = client
        .animes(AnimeSearchParams {
            search: Some("bakemono".to_string()),
            limit: Some(3),
            kind: Some("!special".to_string()),
            page: None,
        })
        .await?;

    println!("НайдСно анимС: {}\n", animes.len());

    for (i, anime) in animes.iter().enumerate() {
        println!("  {}. {} (ID: {})", i + 1, anime.name, anime.id);
        if let Some(russian) = &anime.russian {
            println!("     РусскоС Π½Π°Π·Π²Π°Π½ΠΈΠ΅: {}", russian);
        }
        if let Some(score) = anime.score {
            println!("     ΠžΡ†Π΅Π½ΠΊΠ°: {:.2}", score);
        }
        if let Some(status) = &anime.status {
            println!("     Бтатус: {}", status);
        }
        println!();
    }

    // ВСст 2: Поиск ΠΌΠ°Π½Π³ΠΈ
    println!("πŸ“š ВСст 2: Поиск ΠΌΠ°Π½Π³ΠΈ");
    println!("Π›ΠΈΠΌΠΈΡ‚: 5\n");

    let mangas = client
        .mangas(MangaSearchParams {
            limit: Some(5),
            search: None,
            kind: None,
            page: None,
        })
        .await?;

    println!("НайдСно манги: {}\n", mangas.len());

    for (i, manga) in mangas.iter().take(3).enumerate() {
        println!("  {}. {} (ID: {})", i + 1, manga.name, manga.id);
        if let Some(russian) = &manga.russian {
            println!("     РусскоС Π½Π°Π·Π²Π°Π½ΠΈΠ΅: {}", russian);
        }
        if let Some(chapters) = manga.chapters {
            println!("     Π“Π»Π°Π²: {}", chapters);
        }
        println!();
    }

    // ВСст 3: Поиск пСрсонаТСй
    println!("πŸ‘€ ВСст 3: Поиск пСрсонаТСй");
    println!("Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π°: 1, Π»ΠΈΠΌΠΈΡ‚: 5\n");

    let characters = client
        .characters(CharacterSearchParams {
            page: Some(1),
            limit: Some(5),
            ids: None,
        })
        .await?;

    println!("НайдСно пСрсонаТСй: {}\n", characters.len());

    for (i, character) in characters.iter().take(3).enumerate() {
        println!("  {}. {} (ID: {})", i + 1, character.name, character.id);
        if let Some(russian) = &character.russian {
            println!("     РусскоС имя: {}", russian);
        }
        println!();
    }

    // ВСст 4: Поиск пСрсонаТСй ΠΏΠΎ ID
    println!("πŸ” ВСст 4: Поиск пСрсонаТСй ΠΏΠΎ ID");
    println!("ID: [1, 2, 3]\n");

    let characters_by_ids = client
        .characters(CharacterSearchParams {
            page: None,
            limit: None,
            ids: Some(vec!["1".to_string(), "2".to_string(), "3".to_string()]),
        })
        .await?;

    println!("НайдСно пСрсонаТСй: {}\n", characters_by_ids.len());

    for character in &characters_by_ids {
        println!("  - {} (ID: {})", character.name, character.id);
    }
    println!();

    // ВСст 5: Поиск людСй
    println!("πŸ‘₯ ВСст 5: Поиск людСй");
    println!("Π›ΠΈΠΌΠΈΡ‚: 3\n");

    let people = client
        .people(PeopleSearchParams {
            limit: Some(3),
            search: None,
        })
        .await?;

    println!("НайдСно людСй: {}\n", people.len());

    for (i, person) in people.iter().enumerate() {
        println!("  {}. {} (ID: {})", i + 1, person.name, person.id);
        if let Some(russian) = &person.russian {
            println!("     РусскоС имя: {}", russian);
        }
        if let Some(is_seyu) = person.is_seyu
            && is_seyu
        {
            println!("     БСйю");
        }
        if let Some(is_mangaka) = person.is_mangaka
            && is_mangaka
        {
            println!("     Мангака");
        }
        println!();
    }

    // ВСст 6: Π”Π΅Ρ‚Π°Π»ΡŒΠ½Π°Ρ информация ΠΎΠ± Π°Π½ΠΈΠΌΠ΅
    if let Some(first_anime) = animes.first() {
        println!("πŸ“‹ ВСст 6: Π”Π΅Ρ‚Π°Π»ΡŒΠ½Π°Ρ информация ΠΎΠ± Π°Π½ΠΈΠΌΠ΅");
        println!("АнимС: {}\n", first_anime.name);

        if let Some(genres) = &first_anime.genres
            && !genres.is_empty()
        {
            println!("  Π–Π°Π½Ρ€Ρ‹:");
            for genre in genres.iter().take(5) {
                println!("    - {}", genre.name);
            }
            println!();
        }

        if let Some(studios) = &first_anime.studios
            && !studios.is_empty()
        {
            println!("  Π‘Ρ‚ΡƒΠ΄ΠΈΠΈ:");
            for studio in studios.iter() {
                println!("    - {}", studio.name);
            }
            println!();
        }

        if let Some(aired_on) = &first_anime.aired_on
            && let Some(date) = &aired_on.date
        {
            println!("  Π”Π°Ρ‚Π° Π²Ρ‹Ρ…ΠΎΠ΄Π°: {}", date);
        }

        if let Some(description) = &first_anime.description {
            let desc_short = if description.len() > 200 {
                &description[..200]
            } else {
                description
            };
            println!("\n  ОписаниС: {}...", desc_short);
        }
    }

    println!("\nβœ… ВсС тСсты ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ!");

    Ok(())
}