roblox-api 0.1.8

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

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

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

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct PublishedAssetVersion {
    #[serde(rename = "Id")]
    pub id: u64,
    pub asset_id: u64,
    #[serde(rename = "assetVersionNumber")]
    pub asset_version: u64,
    #[serde(rename = "creatorTargetId")]
    pub creator_id: u64,
    pub creator_type: String,
    pub created: DateTime,
    pub is_published: bool,
    #[serde(rename = "isEqualToCurrentPublishedVersion")]
    pub is_current_published_version: bool,
}

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

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct AssetCreator {
    #[serde(rename = "targetId")]
    pub id: u64,
    #[serde(rename = "type")]
    pub kind: String,
    pub type_id: u32,
}

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Asset {
    pub id: u64,
    pub name: String,
    pub description: String,
    #[serde(rename = "type")]
    pub kind: String,
    pub type_id: u32,

    #[serde(rename = "enableComments")]
    pub comments_enabled: bool,
    pub is_copying_allowed: bool,
    #[serde(rename = "isPublicDomainEnabled")]
    pub is_public_domain: bool,
    pub is_moderated: bool,
    pub is_archivable: bool,
    #[serde(rename = "canHaveThumbnail")]
    pub thumbnails_allowed: bool,
    pub is_versioning_enabled: bool,

    pub moderation_status: Option<String>,
    pub review_status: String,

    pub created: DateTime,
    pub updated: DateTime,

    pub genres: Vec<String>,
    pub creator: AssetCreator,
}

#[derive(Deserialize)]
struct AssetsResponse {
    #[serde(rename = "data")]
    assets: Vec<Asset>,
}

endpoint! {
    assets(ids: &[u64]) -> Vec<Asset> {
        GET "{URL}/assets";
        prelude {
            let ids = ids
                .iter()
                .map(|x| x.to_string())
                .collect::<Vec<String>>()
                .join(",");
        }
        query {
            "assetIds" => &ids,
        }
        map |r: AssetsResponse| r.assets
    }

    published_asset_versions(id: u64, paging: Paging<'_>) -> PublishedAssetVersions {
        GET "{URL}/assets/{id}/published-versions";
        paging_query { paging, limit = 10 }
    }

    revert_asset_version(id: u64, version: u64) -> () {
        POST "{URL}/assets/{id}/revert-version?assetVersionNumber={version}";
    }
}