use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use prima_bridge::prelude::*;
use prima_bridge::{GraphQLMultipart, MultipartFile, 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().build(URL.parse().unwrap());
let bytes: Vec<u8> = vec![];
let slug: String = "backend-engineer".to_string();
let mut map: HashMap<&str, Vec<MultipartFile>> = HashMap::new();
map.insert(
"multi.files",
vec![
MultipartFile::new(bytes.clone()).with_name("ciao1"),
MultipartFile::new(bytes.clone()).with_name("ciao2"),
],
);
map.insert(
"multi.images",
vec![MultipartFile::new(bytes.clone()).with_name("ciao3")],
);
let multipart: GraphQLMultipart = GraphQLMultipart::multiple(map);
let response: Response =
GraphQLRequest::new_with_multipart(&bridge, (QUERY, Some(JobsRequest::new(slug))), multipart)
.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,
}