diff --git a/cli/src/main.rs b/cli/src/main.rs index 545107c..bf65597 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -41,7 +41,7 @@ fn main() { .expect("Error reading from stdin"); if let Some(response) = block_on(run_query::( - VideogameSearchVars { name: search }, + VideogameSearchVars { name: &search }, &auth_key, )) { for game in response.into_iter() { diff --git a/cli/src/queries.rs b/cli/src/queries.rs index c33e0ef..87e2315 100644 --- a/cli/src/queries.rs +++ b/cli/src/queries.rs @@ -1,5 +1,3 @@ -use std::fmt::{Display, Formatter}; - use cynic::{GraphQlResponse, QueryBuilder}; use serde::{Deserialize, Serialize}; @@ -19,18 +17,24 @@ pub struct ID(pub u64); #[derive(Debug, Copy, Clone)] pub struct VideogameId(pub u64); #[derive(Debug, Copy, Clone)] -pub struct PlayerId(pub u64); +pub struct EntrantId(pub u64); // Query machinery pub trait QueryUnwrap: QueryBuilder { + type VarsUnwrapped; type Unwrapped; + fn wrap_vars(vars: Self::VarsUnwrapped) -> Vars; + fn unwrap_response(response: GraphQlResponse) -> Option; } // Generic function for running start.gg queries -pub async fn run_query(vars: Vars, auth: &str) -> Option +pub async fn run_query( + vars: Builder::VarsUnwrapped, + auth: &str, +) -> Option where Builder: QueryUnwrap, Vars: Serialize, @@ -38,7 +42,7 @@ where { use cynic::http::SurfExt; - let query = Builder::build(vars); + let query = Builder::build(>::wrap_vars(vars)); let response = surf::post("https://api.start.gg/gql/alpha") .header("Authorization", String::from("Bearer ") + auth) diff --git a/cli/src/queries/search_games.rs b/cli/src/queries/search_games.rs index 97e1c27..b90fab4 100644 --- a/cli/src/queries/search_games.rs +++ b/cli/src/queries/search_games.rs @@ -2,11 +2,11 @@ use super::{QueryUnwrap, VideogameId, ID}; use cynic::GraphQlResponse; use schema::schema; -// Query +// Variables #[derive(cynic::QueryVariables)] -pub struct VideogameSearchVars { - pub name: String, +pub struct VideogameSearchVars<'a> { + pub name: &'a str, } // Query @@ -15,18 +15,18 @@ pub struct VideogameSearchVars { #[cynic(graphql_type = "Query", variables = "VideogameSearchVars")] pub struct VideogameSearch { #[arguments(query: { filter: { name: $name }, page: 1, perPage: 10 })] - pub videogames: Option, + videogames: Option, } #[derive(cynic::QueryFragment, Debug)] -pub struct VideogameConnection { - pub nodes: Option>>, +struct VideogameConnection { + nodes: Option>>, } #[derive(cynic::QueryFragment, Debug)] -pub struct Videogame { - pub id: Option, - pub name: Option, +struct Videogame { + id: Option, + name: Option, } // Unwrapping @@ -36,9 +36,14 @@ pub struct VideogameResponse { pub name: String, } -impl QueryUnwrap for VideogameSearch { +impl<'a> QueryUnwrap> for VideogameSearch { + type VarsUnwrapped = VideogameSearchVars<'a>; type Unwrapped = Vec; + fn wrap_vars(vars: VideogameSearchVars) -> VideogameSearchVars { + vars + } + fn unwrap_response( response: GraphQlResponse, ) -> Option> { @@ -48,14 +53,14 @@ impl QueryUnwrap for VideogameSearch { .videogames? .nodes? .into_iter() - .map(|game| { + .filter_map(|game| { let game_ = game?; Some(VideogameResponse { id: VideogameId(game_.id?.0), name: game_.name?, }) }) - .try_collect()?, + .collect(), ) } }