roblox-api 0.1.8

Roblox web api bindings
Documentation
use serde::{Deserialize, Serialize};

use crate::{AssetTypeId, Paging, endpoint};

pub const URL: &str = "https://inventory.roblox.com/v1";

#[repr(u8)]
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum ItemType {
    Asset = 0,
    Gamepass,
    Badge,
    Bundle,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AssetInfo {
    pub id: u64,
    #[serde(rename = "type")]
    pub kind: String,
    pub name: String,
    pub instance_id: u64,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct UserOwnsAssets {
    #[serde(rename = "nextPageCursor")]
    pub next_cursor: Option<String>,
    #[serde(rename = "previousPageCursor")]
    pub previous_cursor: Option<String>,
    #[serde(rename = "data")]
    pub assets: Vec<AssetInfo>,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CollectibleInfo {
    #[serde(rename = "assetId")]
    pub id: u64,
    pub original_price: u64,
    pub recent_average_price: u64,
    #[serde(rename = "assetStock")]
    pub stock: u64,
    #[serde(rename = "userAssetId")]
    pub instance_id: u64,
    pub name: String,
    #[serde(rename = "buildersClubMembershipType")]
    pub premium_membership_type: String,
    #[serde(rename = "isOnHold")]
    pub on_hold: bool,
    #[serde(rename = "serialNumber")]
    pub serial: Option<u64>,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct UserOwnedCollectibles {
    #[serde(rename = "nextPageCursor")]
    pub next_cursor: Option<String>,
    #[serde(rename = "previousPageCursor")]
    pub previous_cursor: Option<String>,
    #[serde(rename = "data")]
    pub assets: Vec<CollectibleInfo>,
}

endpoint! {
    can_view_inventory(user_id: u64) -> bool {
        GET "{URL}/users/{user_id}/can-view-inventory";

        types {
            Response {
                can_view("canView"): bool,
            }
        }

        map |r: Response| r.can_view
    }

    user_owns_assets(user_id: u64, id: u64, item_type: ItemType, paging: Paging<'_>) -> UserOwnsAssets {
        GET "{URL}/users/{user_id}/items/{item_type_as_u8}/{id}";

        prelude {
            let item_type_as_u8 = item_type as u8;
            let cursor = match paging.cursor {
                Some(cursor) => cursor.to_string(),
                None => String::new(),
            };
        }

        query {
            "cursor" => &cursor,
        }
    }

    user_owned_collectibles(user_id: u64, asset_type_id: Option<AssetTypeId>, paging: Paging<'_>) -> UserOwnedCollectibles {
        GET "{URL}/users/{user_id}/assets/collectibles";

        paging_query { paging, limit = 10 }

        prelude {
            let asset_type = match asset_type_id {
                Some(id) => (id as u8).to_string(),
                None => String::new(),
            };
        }

        query {
            "assetType" => &asset_type,
        }
    }
}