arthurkhlghatyan/gql-client-rs

Minimal GraphQL client for Rust

Simple API, supports queries and mutations

gql_client

  • Does not require schema file for introspection
  • Supports WebAssembly

Basic Usage

  • Use client.query_with_vars for queries with variables
  • There's also a wrapper client.query if there is no need to pass variables
use gql_client::Client;
use serde::{Deserialize, Serialize};

#[derive(Deserialize)]
pub struct Data {
   user: User
}

#[derive(Deserialize)]
pub struct User {
   id: String,
   name: String
}

#[derive(Serialize)]
pub struct Vars {
   id: u32
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
   let endpoint = "https://graphqlzero.almansi.me/api";
   let query = r#"
       query UserByIdQuery($id: ID!) {
           user(id: $id) {
               id
               name
           }
       }
   "#;

   let client = Client::new(endpoint);
   let vars = Vars { id: 1 };
   let data = client.query_with_vars::<Data, Vars>(query, vars).await.unwrap();

   println!("Id: {}, Name: {}", data.user.id, data.user.name);

   Ok(())
}

Passing HTTP headers

Client exposes new_with_headers function to pass headers using simple HashMap<&str, &str>

use gql_client::Client;
use std::collections::HashMap;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
   let endpoint = "https://graphqlzero.almansi.me/api";
   let mut headers = HashMap::new();
   headers.insert("authorization", "Bearer <some_token>");

   let client = Client::new_with_headers(endpoint, headers);

   Ok(())
}

Error handling

There are two types of errors that can possibly occur. HTTP related errors (for example, authentication problem) or GraphQL query errors in JSON response. Debug, Display implementation of GraphQLError struct properly displays those error messages. Additionally, you can also look at JSON content for more detailed output by calling err.json()

use gql_client::Client;
use serde::{Deserialize, Serialize};

#[derive(Deserialize)]
pub struct Data {
   user: User
}

#[derive(Deserialize)]
pub struct User {
   id: String,
   name: String
}

#[derive(Serialize)]
pub struct Vars {
   id: u32
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
   let endpoint = "https://graphqlzero.almansi.me/api";

   // Send incorrect request
   let query = r#"
       query UserByIdQuery($id: ID!) {
           user(id: $id) {
               id1
               name
           }
       }
   "#;

   let client = Client::new(endpoint);
   let vars = Vars { id: 1 };
   let error = client.query_with_vars::<Data, Vars>(query, vars).await.err();

   println!("{:?}", error);

   Ok(())
}

Information - Updated Jul 24, 2022

Stars: 28
Forks: 7
Issues: 1
IDE

3.5K

Rust Language Server (RLS)

The RLS provides a server that runs in the background, providing IDEs,

Rust Language Server (RLS)

Rust lang bookmarking tool

Rust and Rocket used bookmarking tool for search bar

Rust lang bookmarking tool

Rust Language Security

execrices: RUSTSEC-2021-0001

Rust Language Security

False Positive for rust-lang/rust#83583

The deprecation lint proc_macro_derive_resolution_fallback is intended to catch proc macro generated code that refers to items from parent modules that should not be in scope:

False Positive for rust-lang/rust#83583

rust_icu: low-level rust language bindings for the ICU library

See: The latest version of this file is available at

rust_icu: low-level rust language bindings for the ICU library

Rust lang exercises

Personal tips and drills in my journey as a beginner rustacean

Rust lang exercises

😍 Rust Language

👍 Download and execute rustup

😍 Rust Language

TensorFlow Rust provides idiomatic Rust language

bindings for Documentation

TensorFlow Rust provides idiomatic Rust language

Rust Language Learning material

Rust is blazingly fast systems programming language that prevents segfaults and guarantees thread safety

Rust Language Learning material
Facebook Instagram Twitter GitHub Dribbble
Privacy