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#[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  /// Is `None` if the key has not been claimed
20  owner: Option<User>,
21}
22
23impl Itchio {
24  /// Get a download key: <https://itch.io/docs/api/serverside#reference/gameviewpurchases-httpsitchioapi1keygamegame-iddownload-keys>
25  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}