roblox_api/api/inventory/
v1.rs1use serde::{Deserialize, Serialize};
2
3use crate::{AssetTypeId, Paging, endpoint};
4
5pub const URL: &str = "https://inventory.roblox.com/v1";
6
7#[repr(u8)]
8#[derive(Clone, Debug, Deserialize, Serialize)]
9pub enum ItemType {
10 Asset = 0,
11 Gamepass,
12 Badge,
13 Bundle,
14}
15
16#[derive(Clone, Debug, Deserialize, Serialize)]
17#[serde(rename_all = "camelCase")]
18pub struct AssetInfo {
19 pub id: u64,
20 #[serde(rename = "type")]
21 pub kind: String,
22 pub name: String,
23 pub instance_id: u64,
24}
25
26#[derive(Clone, Debug, Deserialize, Serialize)]
27pub struct UserOwnsAssets {
28 #[serde(rename = "nextPageCursor")]
29 pub next_cursor: Option<String>,
30 #[serde(rename = "previousPageCursor")]
31 pub previous_cursor: Option<String>,
32 #[serde(rename = "data")]
33 pub assets: Vec<AssetInfo>,
34}
35
36#[derive(Clone, Debug, Deserialize, Serialize)]
37#[serde(rename_all = "camelCase")]
38pub struct CollectibleInfo {
39 #[serde(rename = "assetId")]
40 pub id: u64,
41 pub original_price: u64,
42 pub recent_average_price: u64,
43 #[serde(rename = "assetStock")]
44 pub stock: u64,
45 #[serde(rename = "userAssetId")]
46 pub instance_id: u64,
47 pub name: String,
48 #[serde(rename = "buildersClubMembershipType")]
49 pub premium_membership_type: String,
50 #[serde(rename = "isOnHold")]
51 pub on_hold: bool,
52 #[serde(rename = "serialNumber")]
53 pub serial: Option<u64>,
54}
55
56#[derive(Clone, Debug, Deserialize, Serialize)]
57pub struct UserOwnedCollectibles {
58 #[serde(rename = "nextPageCursor")]
59 pub next_cursor: Option<String>,
60 #[serde(rename = "previousPageCursor")]
61 pub previous_cursor: Option<String>,
62 #[serde(rename = "data")]
63 pub assets: Vec<CollectibleInfo>,
64}
65
66endpoint! {
67 can_view_inventory(user_id: u64) -> bool {
68 GET "{URL}/users/{user_id}/can-view-inventory";
69
70 types {
71 Response {
72 can_view("canView"): bool,
73 }
74 }
75
76 map |r: Response| r.can_view
77 }
78
79 user_owns_assets(user_id: u64, id: u64, item_type: ItemType, paging: Paging<'_>) -> UserOwnsAssets {
80 GET "{URL}/users/{user_id}/items/{item_type_as_u8}/{id}";
81
82 prelude {
83 let item_type_as_u8 = item_type as u8;
84 let cursor = match paging.cursor {
85 Some(cursor) => cursor.to_string(),
86 None => String::new(),
87 };
88 }
89
90 query {
91 "cursor" => &cursor,
92 }
93 }
94
95 user_owned_collectibles(user_id: u64, asset_type_id: Option<AssetTypeId>, paging: Paging<'_>) -> UserOwnedCollectibles {
96 GET "{URL}/users/{user_id}/assets/collectibles";
97
98 paging_query { paging, limit = 10 }
99
100 prelude {
101 let asset_type = match asset_type_id {
102 Some(id) => (id as u8).to_string(),
103 None => String::new(),
104 };
105 }
106
107 query {
108 "assetType" => &asset_type,
109 }
110 }
111}