itchio_api/
download_keys.rs1use chrono::{DateTime, Utc};
2use serde::Deserialize;
3
4use crate::{Itchio, ItchioError, User, parsers::date_from_str};
5
6#[derive(Clone, Debug, Deserialize)]
7struct WrappedDownloadKey {
8 download_key: DownloadKey
9}
10
11#[derive(Clone, Debug, Deserialize)] #[allow(dead_code)]
12pub struct DownloadKey {
13 id: u64,
14 #[serde(deserialize_with = "date_from_str")]
15 created_at: DateTime<Utc>,
16 downloads: u64,
17 key: String,
18 game_id: u32,
19 owner: Option<User>,
21}
22
23impl Itchio {
24 pub async fn get_download_key(&self, game_id: u32, lookup: &str, property_name: &str) -> Result<DownloadKey, ItchioError> {
26 let url = format!("game/{}/download_keys?{}={}", game_id, property_name, lookup);
27 let response = self.request::<WrappedDownloadKey>(url).await?;
28 Ok(response.download_key)
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35 use std::env;
36 use dotenv::dotenv;
37
38 #[tokio::test]
39 async fn good() {
40 dotenv().ok();
41 let client_secret = env::var("KEY").expect("KEY has to be set");
42 let key_string = env::var("DOWNLOAD_KEY").expect("DOWNLOAD_KEY has to be set");
43 let api = Itchio::new(client_secret);
44 let download_key = api.get_download_key(
45 2295061,
46 key_string.as_str(),
47 "download_key"
48 ).await.inspect_err(|err| eprintln!("Error spotted: {}", err));
49 assert!(download_key.is_ok())
50 }
51
52 #[tokio::test]
53 async fn bad_key() {
54 dotenv().ok();
55 let key_string = env::var("DOWNLOAD_KEY").expect("DOWNLOAD_KEY has to be set");
56 let api = Itchio::new("bad_key".to_string());
57 let download_key = api.get_download_key(
58 2295061,
59 key_string.as_str(),
60 "download_key"
61 ).await;
62 assert!(download_key.is_err_and(|err| matches!(err, ItchioError::BadKey)))
63 }
64}