roblox-api 0.1.2

Roblox web api bindings
Documentation
use serde::Deserialize;

use crate::{DateTime, Error, Paging, client::Client};

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

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

#[derive(Clone, Debug, Deserialize, 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, PartialEq, Eq)]
pub struct AssetCreator {
    #[serde(rename = "targetId")]
    pub id: u64,
    #[serde(rename = "type")]
    pub kind: String,
    #[serde(rename = "typeId")]
    pub type_id: u32,
}

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

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

    #[serde(rename = "moderationStatus")]
    pub moderation_status: Option<String>,
    #[serde(rename = "reviewStatus")]
    pub review_status: String,

    #[serde(rename = "created")]
    pub creation_date: DateTime,
    #[serde(rename = "updated")]
    pub last_updated_date: DateTime,

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

pub async fn assets(client: &mut Client, ids: &[u64]) -> Result<Vec<Asset>, Error> {
    let ids = ids
        .iter()
        .map(|x| x.to_string())
        .collect::<Vec<String>>()
        .join(",");

    let result = client
        .requestor
        .client
        .get(format!("{URL}/assets?assetIds={ids}"))
        .headers(client.requestor.default_headers.clone())
        .send()
        .await;

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

    let response = client.validate_response(result).await?;
    Ok(client
        .requestor
        .parse_json::<Response>(response)
        .await?
        .assets)
}

pub async fn published_asset_versions(
    client: &mut Client,
    id: u64,
    paging: Paging<'_>,
) -> Result<PublishedAssetVersions, Error> {
    let result = client
        .requestor
        .client
        .get(format!("{URL}/assets/{id}/published-versions"))
        .headers(client.requestor.default_headers.clone())
        .send()
        .await;

    let response = client.validate_response(result).await?;
    client
        .requestor
        .parse_json::<PublishedAssetVersions>(response)
        .await
}

pub async fn revert_asset_version(client: &mut Client, id: u64, version: u64) -> Result<(), Error> {
    let result = client
        .requestor
        .client
        .post(format!(
            "{URL}/assets/{id}/revert-version?assetVersionNumber={version}"
        ))
        .headers(client.requestor.default_headers.clone())
        .send()
        .await;

    client.validate_response(result).await?;
    Ok(())
}