#graphql #api-client #graphql-client #async #sdk #wrapper #api-bindings

shikimori

An unofficial async Rust library that allows you to interact with the Shikimori API

12 unstable releases (3 breaking)

0.4.3 Nov 29, 2024
0.4.1 Aug 2, 2024
0.4.0 Jul 10, 2024
0.3.0 Mar 18, 2024
0.1.2 Oct 19, 2023

#1443 in Web programming

Download history 24/week @ 2024-09-16 5/week @ 2024-09-23 19/week @ 2024-09-30 5/week @ 2024-10-07 207/week @ 2024-11-25 54/week @ 2024-12-02

261 downloads per month

MIT license

63KB
2K SLoC

Rust 1K SLoC // 0.0% comments GraphQL 552 SLoC // 0.3% comments

Shikimori Rust

Crate version Tests License

Shikimori Rust - An efficient Rust library serving as a wrapper for the Shikimori API 🦾

📖 Documentation

Installation

Install shikimori from crates.io. Add the following line to your Cargo.toml file's dependencies section:

shikimori = "0.4"

Or you can add with cargo

cargo add shikimori

Usage

You should also use querygen to simplify your life, it is available at the link. Get the schema at URL https://shikimori.one/api/graphql

use chrono::{DateTime, Utc};

use shikimori::client::ClientBuilder;
use shikimori::cynic::{self, QueryBuilder};

use shikimori::graphql::anime::AnimeKind;
use shikimori::graphql::scalars::{AnimeStatusString, PositiveInt};
use shikimori::graphql::schema;
use shikimori::graphql::types::EntityOrder;

#[derive(cynic::QueryVariables, Debug)]
pub struct AnimesQueryVariables {
    pub page: PositiveInt,
    pub status: AnimeStatusString,
    pub order: EntityOrder,
}

#[derive(cynic::QueryFragment, Debug)]
#[cynic(graphql_type = "Query", variables = "AnimesQueryVariables")]
pub struct AnimesQuery {
    #[arguments(censored: false, page: $page, status: $status, order: $order)]
    pub animes: Vec<Anime>,
}

#[derive(cynic::QueryFragment, Debug)]
pub struct Anime {
    pub id: cynic::Id,
    pub franchise: Option<String>,
    pub episodes: i32,
    pub kind: Option<AnimeKind>,
    pub next_episode_at: Option<DateTime<Utc>>,
    pub url: String,
}

#[tokio::main]
async fn main() {
    let client = ClientBuilder::new().build();

    let response = client
        .query(AnimesQuery::build(AnimesQueryVariables {
            page: PositiveInt::new(1u32),
            status: AnimeStatusString::new("ongoing"),
            order: EntityOrder::Popularity,
        }))
        .await;

    dbg!(&response);
}

// Ok(
//     GraphQlResponse {
//         data: Some(
//             AnimesQuery {
//                 animes: [
//                     Anime {
//                         id: Id(
//                             "21",
//                         ),
//                         franchise: Some(
//                             "one_piece",
//                         ),
//                         episodes: 0,
//                         kind: Some(
//                             Tv,
//                         ),
//                         next_episode_at: Some(
//                             2023-09-10T00:30:00Z,
//                         ),
//                         url: "https://shikimori.one/animes/21-one-piece",
//                     },
//                     Anime {
//                         id: Id(
//                             "51009",
//                         ),
//                         franchise: Some(
//                             "jujutsu_kaisen",
//                         ),
//                         episodes: 23,
//                         kind: Some(
//                             Tv,
//                         ),
//                         next_episode_at: Some(
//                             2023-09-07T14:56:00Z,
//                         ),
//                         url: "https://shikimori.one/animes/51009-jujutsu-kaisen-2nd-season",
//                     },
//                 ],
//             },
//         ),
//         errors: None,
//     },
// )

In the build.rs file with feature register-graphql-schema enabled

fn main() {
    shikimori::graphql::register_schema();
}

Dependencies

~13–25MB
~341K SLoC