Skip to main content

itchio_api/
download_keys.rs

1use chrono::{DateTime, Utc};
2use serde::Deserialize;
3
4use crate::{Itchio, ItchioError, User, parsers::date_from_str};
5
6/// The original response this crate gets from the server, useless to crate users.
7#[derive(Clone, Debug, Deserialize)]
8struct WrappedDownloadKey {
9  download_key: DownloadKey
10}
11
12/// An Object containing all the information regarding a download key, including the key itself.
13#[derive(Clone, Debug, Deserialize)]
14pub struct DownloadKey {
15  pub id: u64,
16  #[serde(deserialize_with = "date_from_str")]
17  pub created_at: DateTime<Utc>,
18  pub downloads: u64,
19  pub key: String,
20  pub game_id: u32,
21  /// Is `None` if the key has not been claimed
22  pub owner: Option<User>,
23}
24
25impl Itchio {
26  /// Get a download key: <https://itch.io/docs/api/serverside#reference/gameviewpurchases-httpsitchioapi1keygamegame-iddownload-keys>
27  pub async fn get_download_key(&self, game_id: u32, lookup: &str, property_name: &str) -> Result<DownloadKey, ItchioError> {
28    let url = format!("game/{}/download_keys?{}={}", game_id, property_name, lookup);
29    let response = self.request::<WrappedDownloadKey>(url).await?;
30    Ok(response.download_key)
31  }
32}
33
34#[cfg(test)]
35mod tests {
36  use super::*;
37  use std::env;
38  use dotenv::dotenv;
39
40  #[tokio::test]
41  async fn good() {
42    dotenv().ok();
43    let client_secret = env::var("KEY").expect("KEY has to be set");
44    let key_string = env::var("DOWNLOAD_KEY").expect("DOWNLOAD_KEY has to be set");
45    let api = Itchio::new(client_secret).unwrap();
46    let download_key = api.get_download_key(
47      2295061,
48      key_string.as_str(),
49      "download_key"
50    ).await.inspect_err(|err| eprintln!("Error spotted: {}", err));
51    assert!(download_key.is_ok())
52  }
53
54  #[tokio::test]
55  async fn bad_key() {
56    dotenv().ok();
57    let key_string = env::var("DOWNLOAD_KEY").expect("DOWNLOAD_KEY has to be set");
58    let api = Itchio::new("bad_key".to_string()).unwrap();
59    let download_key = api.get_download_key(
60      2295061,
61      key_string.as_str(),
62      "download_key"
63    ).await;
64    assert!(download_key.is_err_and(|err| matches!(err, ItchioError::BadKey)))
65  }
66}