From 5da42575fd9f0d1a55ddbbad0efc63dc46cb59a5 Mon Sep 17 00:00:00 2001 From: Geometrically <18202329+Geometrically@users.noreply.github.com> Date: Fri, 23 Dec 2022 19:49:47 -0700 Subject: [PATCH] Add validator for file types + datapacks (#507) * Add validator for file types + datapacks * Make it compile --- src/routes/version_creation.rs | 1 + src/validate/datapack.rs | 38 ++++++++++++++++++++++++++++++++++ src/validate/mod.rs | 23 ++++++++++++++++---- src/validate/resourcepack.rs | 2 +- 4 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 src/validate/datapack.rs diff --git a/src/routes/version_creation.rs b/src/routes/version_creation.rs index 7b3eecbd..95f591eb 100644 --- a/src/routes/version_creation.rs +++ b/src/routes/version_creation.rs @@ -703,6 +703,7 @@ pub async fn upload_file( loaders.clone(), game_versions.clone(), all_game_versions.clone(), + file_type, ) .await?; diff --git a/src/validate/datapack.rs b/src/validate/datapack.rs new file mode 100644 index 00000000..20da36b5 --- /dev/null +++ b/src/validate/datapack.rs @@ -0,0 +1,38 @@ +use crate::validate::{ + SupportedGameVersions, ValidationError, ValidationResult, +}; +use std::io::Cursor; +use zip::ZipArchive; + +pub struct DataPackValidator; + +impl super::Validator for DataPackValidator { + fn get_file_extensions(&self) -> &[&str] { + &["zip"] + } + + fn get_project_types(&self) -> &[&str] { + &["mod"] + } + + fn get_supported_loaders(&self) -> &[&str] { + &["datapack"] + } + + fn get_supported_game_versions(&self) -> SupportedGameVersions { + SupportedGameVersions::All + } + + fn validate( + &self, + archive: &mut ZipArchive>, + ) -> Result { + archive.by_name("pack.mcmeta").map_err(|_| { + ValidationError::InvalidInput( + "No pack.mcmeta present for datapack file. Tip: Make sure pack.mcmeta is in the root directory of your datapack!".into(), + ) + })?; + + Ok(ValidationResult::Pass) + } +} diff --git a/src/validate/mod.rs b/src/validate/mod.rs index 7b6ee91a..197ff9df 100644 --- a/src/validate/mod.rs +++ b/src/validate/mod.rs @@ -1,5 +1,6 @@ use crate::models::pack::PackFormat; -use crate::models::projects::{GameVersion, Loader}; +use crate::models::projects::{FileType, GameVersion, Loader}; +use crate::validate::datapack::DataPackValidator; use crate::validate::fabric::FabricValidator; use crate::validate::forge::{ForgeValidator, LegacyForgeValidator}; use crate::validate::liteloader::LiteLoaderValidator; @@ -15,6 +16,7 @@ use std::io::Cursor; use thiserror::Error; use zip::ZipArchive; +mod datapack; mod fabric; mod forge; mod liteloader; @@ -80,7 +82,7 @@ pub trait Validator: Sync { ) -> Result; } -static VALIDATORS: [&dyn Validator; 15] = [ +static VALIDATORS: [&dyn Validator; 16] = [ &ModpackValidator, &FabricValidator, &ForgeValidator, @@ -96,21 +98,34 @@ static VALIDATORS: [&dyn Validator; 15] = [ &CanvasShaderValidator, &ShaderValidator, &CoreShaderValidator, + &DataPackValidator, ]; /// The return value is whether this file should be marked as primary or not, based on the analysis of the file pub async fn validate_file( data: bytes::Bytes, file_extension: String, - project_type: String, - loaders: Vec, + mut project_type: String, + mut loaders: Vec, game_versions: Vec, all_game_versions: Vec, + file_type: Option, ) -> Result { actix_web::web::block(move || { let reader = Cursor::new(data); let mut zip = ZipArchive::new(reader)?; + if let Some(file_type) = file_type { + match file_type { + FileType::RequiredResourcePack + | FileType::OptionalResourcePack => { + project_type = "resourcepack".to_string(); + loaders = vec![Loader("minecraft".to_string())]; + } + FileType::Unknown => {} + } + } + let mut visited = false; for validator in &VALIDATORS { if validator.get_project_types().contains(&&*project_type) diff --git a/src/validate/resourcepack.rs b/src/validate/resourcepack.rs index 4f5fc380..2610d570 100644 --- a/src/validate/resourcepack.rs +++ b/src/validate/resourcepack.rs @@ -13,7 +13,7 @@ impl super::Validator for PackValidator { } fn get_project_types(&self) -> &[&str] { - &["resourcepack", "datapack"] + &["resourcepack"] } fn get_supported_loaders(&self) -> &[&str] {