Files
Starlight_Lancher/packages/modrinth-content-management/src/model.rs
T

134 lines
3.5 KiB
Rust

use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(thiserror::Error, Debug)]
pub enum Error {
#[error("metadata provider error: {0}")]
Provider(String),
#[error("project `{0}` was not found")]
ProjectNotFound(String),
#[error("version `{0}` was not found")]
VersionNotFound(String),
#[error("version `{version_id}` does not belong to project `{project_id}`")]
VersionProjectMismatch {
version_id: String,
project_id: String,
},
#[error("no compatible version was found for project `{0}`")]
NoCompatibleVersion(String),
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum ContentType {
Mod,
Plugin,
DataPack,
ResourcePack,
Shader,
ModPack,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct ResolutionPreferences {
#[serde(default)]
pub game_versions: Vec<String>,
#[serde(default)]
pub loaders: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ResolveContentRequest {
pub project_id: String,
pub version_id: Option<String>,
pub content_type: ContentType,
#[serde(default)]
pub selected: ResolutionPreferences,
#[serde(default)]
pub target: ResolutionPreferences,
#[serde(default)]
pub existing_project_ids: Vec<String>,
#[serde(default)]
pub excluded_project_ids: Vec<String>,
#[serde(default)]
pub force_project_ids: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ResolveContentPlan {
pub primary: ResolvedContent,
pub dependencies: Vec<ResolvedContent>,
pub skipped: Vec<SkippedContent>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ResolvedContent {
pub project_id: String,
pub version_id: String,
pub dependent_on_version_id: Option<String>,
#[serde(default = "default_true")]
pub required: bool,
}
fn default_true() -> bool {
true
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct SkippedContent {
pub project_id: String,
pub version_id: Option<String>,
pub dependent_on_version_id: Option<String>,
pub reason: SkippedReason,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SkippedReason {
AlreadyInstalled,
DuplicateProject,
ConflictingDependency,
NoCompatibleVersion,
MissingVersion,
QuiltFabricApi,
ExcludedByUser,
DependencyCycle,
DependencyDepthExceeded,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct Version {
pub id: String,
pub project_id: String,
pub date_published: DateTime<Utc>,
#[serde(default = "default_version_type")]
pub version_type: String,
#[serde(default)]
pub dependencies: Vec<Dependency>,
#[serde(default)]
pub game_versions: Vec<String>,
#[serde(default)]
pub loaders: Vec<String>,
}
fn default_version_type() -> String {
"release".to_string()
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct Dependency {
pub version_id: Option<String>,
pub project_id: Option<String>,
pub file_name: Option<String>,
pub dependency_type: DependencyType,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum DependencyType {
Required,
Optional,
Incompatible,
Embedded,
}