12 Commits

Author SHA1 Message Date
173ad65c5c Merge pull request 'Fix regex' (#27) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #27
2025-12-20 23:56:07 +00:00
e10cfcfcb5 rox_compiler: fix regex
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-20 15:54:07 -08:00
9080c20227 Merge pull request 'v0.5.1 - Faster Serialize' (#26) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #26
2025-12-13 22:36:44 +00:00
3ec2b659f3 v0.5.1
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-13 14:35:32 -08:00
f2db341277 Merge pull request 'Update deps + drop lazy_regex' (#25) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #25
2025-12-13 22:33:19 +00:00
5a95ccc633 remove unused lints
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-09 14:32:12 -08:00
68a0c7113e use expect instead of allow 2025-12-09 14:31:58 -08:00
2088256e29 update deps
All checks were successful
continuous-integration/drone/push Build is passing
2025-11-27 15:30:53 -08:00
d50e86f809 update deps
All checks were successful
continuous-integration/drone/push Build is passing
2025-11-09 06:06:00 -08:00
b37b08d564 drop lazy_regex dep 2025-11-09 06:04:36 -08:00
316200ead4 Merge pull request 'fix deploy' (#24) from staging into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #24
2025-08-28 11:06:55 +00:00
d66f786aca fix deploy
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-28 04:06:18 -07:00
8 changed files with 539 additions and 534 deletions

962
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
workspace = { members = ["rbx_asset", "rox_compiler"] }
[package]
name = "asset-tool"
version = "0.5.0"
version = "0.5.1"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -11,12 +11,11 @@ anyhow = "1.0.75"
clap = { version = "4.4.2", features = ["derive"] }
futures = "0.3.30"
git2 = { version = "0.20.0", optional = true }
lazy-regex = "3.1.0"
rbx_asset = { path = "rbx_asset", features = ["gzip", "rustls-tls"], default-features = false }
rbx_binary = "1.0.0"
rbx_dom_weak = "3.0.0"
rbx_reflection_database = "1.0.3"
rbx_xml = "1.0.0"
rbx_binary = "2.0.0"
rbx_dom_weak = "4.0.0"
rbx_reflection_database = "2.0.1"
rbx_xml = "2.0.0"
rox_compiler = { path = "rox_compiler" }
serde_json = "1.0.111"
tokio = { version = "1.35.1", features = ["macros", "rt-multi-thread", "fs"] }

View File

@@ -1,3 +1,3 @@
FROM alpine:3.22 AS runtime
COPY /target/x86_64-unknown-linux-musl/release/asset-tool /
ENTRYPOINT ["/asset-tool"]
COPY /target/x86_64-unknown-linux-musl/release/asset-tool /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/asset-tool"]

View File

@@ -3,14 +3,13 @@ use crate::util::{serialize_u64,deserialize_u64,response_ok};
use crate::types::{ResponseError,MaybeGzippedBytes};
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
pub enum AssetType{
Audio,
Decal,
Model,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct CreateAssetRequest{
pub assetType:AssetType,
pub creationContext:CreationContext,
@@ -56,7 +55,7 @@ impl std::fmt::Display for CreateError{
impl std::error::Error for CreateError{}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct UpdateAssetRequest{
pub assetId:u64,
pub displayName:Option<String>,
@@ -65,42 +64,41 @@ pub struct UpdateAssetRequest{
//woo nested roblox stuff
#[derive(Clone,Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub enum Creator{
userId(#[serde(deserialize_with="deserialize_u64",serialize_with="serialize_u64")]u64),
groupId(#[serde(deserialize_with="deserialize_u64",serialize_with="serialize_u64")]u64),
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct CreationContext{
pub creator:Creator,
pub expectedPrice:Option<u64>,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
pub enum ModerationState{
Reviewing,
Rejected,
Approved,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct ModerationResult{
pub moderationState:ModerationState,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct Preview{
pub asset:String,
pub altText:String,
}
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct UpdatePlaceRequest{
pub universeId:u64,
pub placeId:u64,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct UpdatePlaceResponse{
pub versionNumber:u64,
}
@@ -146,7 +144,7 @@ pub struct GetAssetLatestRequest{
}
*/
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct AssetResponse{
//u64 wrapped in quotes wohoo!!
#[serde(deserialize_with="deserialize_u64")]
@@ -166,7 +164,6 @@ pub struct AssetResponse{
#[serde(default)]
pub previews:Vec<Preview>,
}
#[allow(nonstandard_style,dead_code)]
pub struct GetAssetVersionRequest{
pub asset_id:u64,
pub version:u64,
@@ -197,13 +194,13 @@ impl AssetLocation{
}
#[derive(Debug,serde::Deserialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct AssetMetadata{
pub metadataType:u32,
pub value:String,
}
#[derive(Debug,serde::Deserialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct AssetLocationInfo{
pub location:Option<AssetLocation>,
pub requestId:String,
@@ -219,7 +216,7 @@ pub struct AssetVersionsRequest{
pub cursor:Option<String>,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct AssetVersion{
pub Id:u64,
pub assetId:u64,
@@ -231,7 +228,7 @@ pub struct AssetVersion{
pub isPublished:bool,
}
#[derive(Debug,serde::Deserialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct AssetVersionsResponse{
pub previousPageCursor:Option<String>,
pub nextPageCursor:Option<String>,
@@ -255,13 +252,12 @@ pub struct InventoryPageRequest{
pub cursor:Option<String>,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
pub struct InventoryItem{
pub id:u64,
pub name:String,
}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct InventoryPageResponse{
pub totalResults:u64,//up to 50
pub filteredKeyword:Option<String>,//""
@@ -299,7 +295,7 @@ impl std::fmt::Display for OperationError{
}
impl std::error::Error for OperationError{}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
struct RobloxOperation{
pub path:Option<String>,
pub metadata:Option<String>,

View File

@@ -15,7 +15,7 @@ impl std::fmt::Display for PostError{
impl std::error::Error for PostError{}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct CreateRequest{
pub name:String,
pub description:String,
@@ -43,7 +43,7 @@ impl std::fmt::Display for CreateError{
}
impl std::error::Error for CreateError{}
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct UploadRequest{
pub assetid:u64,
pub name:Option<String>,
@@ -73,17 +73,15 @@ impl std::fmt::Display for UploadError{
}
impl std::error::Error for UploadError{}
#[derive(Debug,serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct UploadResponse{
pub AssetId:u64,
pub AssetVersion:u64,
}
#[allow(nonstandard_style,dead_code)]
pub struct GetAssetDetailsRequest{
pub asset_id:u64,
}
#[allow(nonstandard_style,dead_code)]
pub struct GetAssetRequest{
pub asset_id:u64,
pub version:Option<u64>,
@@ -118,13 +116,13 @@ impl std::fmt::Display for GetAssetV2Error{
impl std::error::Error for GetAssetV2Error{}
#[derive(serde::Deserialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct GetAssetV2AssetMetadata{
pub metadataType:u32,
pub value:String,
}
#[derive(serde::Deserialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct GetAssetV2Location{
pub assetFormat:String,// "source"
location:String,// this value is private so users cannot mutate it
@@ -137,7 +135,7 @@ impl GetAssetV2Location{
}
}
#[derive(serde::Deserialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct GetAssetV2Info{
pub locations:Vec<GetAssetV2Location>,
pub requestId:String,
@@ -162,7 +160,7 @@ pub enum CreatorType{
#[derive(Debug)]
#[derive(serde::Deserialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct Creator{
pub Id:u64,
pub Name:String,
@@ -173,7 +171,7 @@ pub struct Creator{
#[derive(Debug)]
#[derive(serde::Deserialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct AssetDetails{
pub TargetId:u64,
pub ProductType:Option<String>,
@@ -209,7 +207,7 @@ pub struct AssetVersionsPageRequest{
pub cursor:Option<String>,
}
#[derive(serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct AssetVersion{
pub Id:u64,
pub assetId:u64,
@@ -221,7 +219,7 @@ pub struct AssetVersion{
pub isPublished:bool,
}
#[derive(serde::Deserialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct AssetVersionsPageResponse{
pub previousPageCursor:Option<String>,
pub nextPageCursor:Option<String>,
@@ -257,13 +255,12 @@ pub struct CreationsPageRequest{
pub cursor:Option<String>,
}
#[derive(serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
pub struct CreationsItem{
pub id:u64,
pub name:String,
}
#[derive(serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct CreationsPageResponse{
pub totalResults:u64,//up to 50
pub filteredKeyword:Option<String>,//""
@@ -282,14 +279,14 @@ pub struct UserInventoryPageRequest{
}
#[derive(serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct UserInventoryItemOwner{
pub userId:u64,
pub username:String,
pub buildersClubMembershipType:String,
}
#[derive(serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct UserInventoryItem{
pub userAssetId:u64,
pub assetId:u64,
@@ -301,7 +298,7 @@ pub struct UserInventoryItem{
pub updated:chrono::DateTime<chrono::Utc>,
}
#[derive(serde::Deserialize,serde::Serialize)]
#[allow(nonstandard_style,dead_code)]
#[expect(nonstandard_style)]
pub struct UserInventoryPageResponse{
pub previousPageCursor:Option<String>,
pub nextPageCursor:Option<String>,
@@ -324,13 +321,13 @@ impl std::fmt::Display for SetAssetsPermissionsError{
impl std::error::Error for SetAssetsPermissionsError{}
#[derive(serde::Serialize)]
#[allow(nonstandard_style)]
#[expect(nonstandard_style)]
struct AssetPermissions{
assetId:u64,
grantToDependencies:bool,//true
}
#[derive(serde::Serialize)]
#[allow(nonstandard_style)]
#[expect(nonstandard_style)]
struct SetAssetsPermissions<'a>{
subjectType:&'a str,// "Universe"
subjectId:&'a str,// "4422715291"

View File

@@ -10,8 +10,8 @@ authors = ["Rhys Lloyd <krakow20@gmail.com>"]
[dependencies]
futures = "0.3.30"
lazy-regex = "3.1.0"
regex = { version = "1.11.3", default-features = false, features = ["unicode-perl"] }
rayon = "1.8.0"
rbx_dom_weak = "3.0.0"
rbx_xml = "1.0.0"
rbx_dom_weak = "4.0.0"
rbx_xml = "2.0.0"
tokio = { version = "1.35.1", features = ["fs"] }

View File

@@ -28,6 +28,16 @@ impl std::fmt::Display for PropertiesOverride{
}
}
pub(crate) fn sanitize(s:&str)->std::borrow::Cow<'_,str>{
lazy_regex::regex!(r"[^A-Za-z0-9.-]").replace_all(s,"_")
#[macro_export]
macro_rules! lazy_regex{
($r:literal)=>{{
use regex::Regex;
use std::sync::LazyLock;
static RE:LazyLock<Regex>=LazyLock::new(||Regex::new($r).unwrap());
&RE
}};
}
pub(crate) fn sanitize(s:&str)->std::borrow::Cow<'_,str>{
lazy_regex!(r"[^A-Za-z0-9.-]").replace_all(s,"_")
}

View File

@@ -2,6 +2,7 @@ use std::path::{Path,PathBuf};
use futures::{StreamExt, TryStreamExt};
use tokio::io::AsyncReadExt;
use crate::lazy_regex;
use crate::common::{sanitize,Style,PropertiesOverride};
//holy smokes what am I doing lmao
@@ -202,7 +203,7 @@ impl ScriptWithOverrides{
let mut count=0;
for line in source.lines(){
//only string type properties are supported atm
if let Some(captures)=lazy_regex::regex!(r#"^\-\-\s*Properties\.([A-Za-z]\w*)\s*\=\s*"(\w+)"$"#)
if let Some(captures)=lazy_regex!(r#"^\-\-\s*Properties\.([A-Za-z]\w*)\s*\=\s*"(\w+)"$"#)
.captures(line){
count+=line.len();
match &captures[1]{
@@ -339,7 +340,7 @@ impl CompileNode{
//reject goobers
let is_goober=matches!(style,Some(Style::Rojo));
let (ext_len,file_discernment)={
if let Some(captures)=lazy_regex::regex!(r"^.*(\.module\.lua|\.client\.lua|\.server\.lua)$")
if let Some(captures)=lazy_regex!(r"^.*(\.module\.lua|\.client\.lua|\.server\.lua)$")
.captures(file_name.as_str()){
let ext=&captures[1];
(ext.len(),match ext{
@@ -353,7 +354,7 @@ impl CompileNode{
".server.lua"=>FileDiscernment::Script(ScriptHint::Script),
_=>panic!("Regex failed"),
})
}else if let Some(captures)=lazy_regex::regex!(r"^.*(\.rbxmx|\.lua)$")
}else if let Some(captures)=lazy_regex!(r"^.*(\.rbxmx|\.lua)$")
.captures(file_name.as_str()){
let ext=&captures[1];
(ext.len(),match ext{