use serde::{Deserialize, Serialize};
use prima_bridge::prelude::*;
use prima_bridge::ParsedGraphqlResponse;
const URL: &str = "https://api.graphql.jobs/";
const QUERY: &str = "query($input:JobsInput!){jobs(input:$input) {\nid\n title\n applyUrl\n}}";
#[tokio::main]
async fn main() {
let bridge: Bridge = Bridge::builder()
.with_refreshing_token(auth0::refreshing_token().await)
.await
.build(URL.parse().unwrap());
let slug: String = "backend-engineer".to_string();
let response: Response = GraphQLRequest::new(&bridge, (QUERY, Some(JobsRequest::new(slug))))
.expect("Failed to create graphql request for query")
.send()
.await
.expect("graphql request results in error");
let response: ParsedGraphqlResponse<JobsResponse> = response
.parse_graphql_response::<JobsResponse>()
.expect("error parsing response");
let response: JobsResponse = response.expect("response is not completed");
println!(
"The first job received from `{}` is {:?}",
URL,
response.jobs.first().unwrap()
);
}
#[derive(Serialize, Debug)]
pub struct JobsRequest {
pub input: JobsInput,
}
impl JobsRequest {
pub fn new(slug: String) -> Self {
Self {
input: JobsInput { slug },
}
}
}
#[derive(Serialize, Debug)]
pub struct JobsInput {
pub slug: String,
}
#[derive(Deserialize, Debug)]
pub struct JobsResponse {
pub jobs: Vec<Job>,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")] pub struct Job {
pub id: String,
pub title: String,
pub apply_url: String,
}
mod auth0 {
use std::time::Duration;
use prima_bridge::auth0::{cache::InMemoryCache, Auth0Client, RefreshingToken, StalenessCheckPercentage};
pub async fn refreshing_token() -> RefreshingToken {
let token_url: String = std::env::var("TOKEN_URL").unwrap();
let client_id: String = std::env::var("CLIENT_ID").unwrap();
let client_secret: String = std::env::var("CLIENT_SECRET").unwrap();
let audience: String = std::env::var("AUDIENCE").unwrap();
let auth0_client = Auth0Client::new(
token_url.parse().unwrap(),
reqwest::Client::default(),
client_id,
client_secret,
);
RefreshingToken::new(
auth0_client,
Duration::from_secs(10),
StalenessCheckPercentage::default(),
Box::new(InMemoryCache::default()),
audience,
None,
)
.await
.unwrap()
}
}