Compare commits

..

No commits in common. "e78317849398c18473bdeb6d44beeec5b91fb87a" and "7ee9ee1159d1bdb9a2ba2ced9fa68f09b0ec4089" have entirely different histories.

3 changed files with 120 additions and 128 deletions

View file

@ -6,75 +6,65 @@ pub trait ExportProfile {
fn rules(&self) -> Vec<Box<dyn Rule>>;
}
/// Implements [`ExportProfile`] for a unit struct with a static name and rule
/// list.
///
/// Each rule entry is an expression evaluated as
/// `Box::new(super::rules::<expr>)`, supporting both bare unit struct names and
/// constructor calls with arguments.
///
/// # Example
///
/// ```ignore
/// export_profile! {
/// MyProfile => "my-profile" {
/// SomeRule,
/// AnotherRule::new("arg"),
/// }
/// }
/// ```
macro_rules! export_profile {
($struct:ident => $name:literal { $($rule:expr),* $(,)? }) => {
pub struct $struct;
pub struct CurseForgeProfile;
pub struct ModrinthProfile;
pub struct ServerPackProfile;
impl ExportProfile for $struct {
impl ExportProfile for CurseForgeProfile {
fn name(&self) -> &'static str {
$name
"curseforge"
}
fn rules(&self) -> Vec<Box<dyn Rule>> {
use super::rules::*;
vec![
$(Box::new($rule)),*
Box::new(super::rules::CopyProjectFilesRule),
Box::new(super::rules::FilterByPlatformRule),
Box::new(super::rules::MissingProjectsAsOverridesRule::new(
"curseforge",
)),
Box::new(super::rules::CopyOverridesRule),
Box::new(super::rules::CopyClientOverridesRule),
Box::new(super::rules::FilterServerOnlyRule),
Box::new(super::rules::GenerateManifestRule::curseforge()),
Box::new(super::rules::FilterNonRedistributableRule),
Box::new(super::rules::TextReplacementRule),
]
}
}
};
}
export_profile! {
CurseForgeProfile => "curseforge" {
CopyProjectFilesRule,
FilterByPlatformRule,
MissingProjectsAsOverridesRule::new("curseforge"),
CopyOverridesRule,
CopyClientOverridesRule,
FilterServerOnlyRule,
GenerateManifestRule::curseforge(),
FilterNonRedistributableRule,
TextReplacementRule
impl ExportProfile for ModrinthProfile {
fn name(&self) -> &'static str {
"modrinth"
}
fn rules(&self) -> Vec<Box<dyn Rule>> {
vec![
Box::new(super::rules::CopyProjectFilesRule),
Box::new(super::rules::FilterByPlatformRule),
Box::new(super::rules::MissingProjectsAsOverridesRule::new(
"modrinth",
)),
Box::new(super::rules::CopyOverridesRule),
Box::new(super::rules::CopyClientOverridesRule),
Box::new(super::rules::FilterServerOnlyRule),
Box::new(super::rules::GenerateManifestRule::modrinth()),
Box::new(super::rules::TextReplacementRule),
]
}
}
export_profile! {
ModrinthProfile => "modrinth" {
CopyProjectFilesRule,
FilterByPlatformRule,
MissingProjectsAsOverridesRule::new("modrinth"),
CopyOverridesRule,
CopyClientOverridesRule,
FilterServerOnlyRule,
GenerateManifestRule::modrinth(),
TextReplacementRule
impl ExportProfile for ServerPackProfile {
fn name(&self) -> &'static str {
"serverpack"
}
}
export_profile! {
ServerPackProfile => "serverpack" {
CopyProjectFilesRule,
CopyServerOverridesRule,
FilterClientOnlyRule,
TextReplacementRule
fn rules(&self) -> Vec<Box<dyn Rule>> {
vec![
Box::new(super::rules::CopyProjectFilesRule),
Box::new(super::rules::CopyServerOverridesRule),
Box::new(super::rules::FilterClientOnlyRule),
Box::new(super::rules::TextReplacementRule),
]
}
}

View file

@ -578,53 +578,6 @@ pub struct LockFile {
pub lockfile_version: u32,
}
impl LockFile {
pub fn get_project(&self, pakku_id: &str) -> Option<&Project> {
self
.projects
.iter()
.find(|p| p.pakku_id.as_deref() == Some(pakku_id))
}
pub fn get_loader_names(&self) -> Vec<String> {
self.loaders.keys().cloned().collect()
}
pub fn remove_project(&mut self, pakku_id: &str) -> Option<Project> {
if let Some(pos) = self
.projects
.iter()
.position(|p| p.pakku_id.as_deref() == Some(pakku_id))
{
Some(self.projects.remove(pos))
} else {
None
}
}
pub fn find_project(&self, pakku_id: &str) -> Option<&Project> {
self.get_project(pakku_id)
}
pub fn find_project_mut(&mut self, pakku_id: &str) -> Option<&mut Project> {
self
.projects
.iter_mut()
.find(|p| p.pakku_id.as_deref() == Some(pakku_id))
}
pub fn find_project_by_platform_id(
&self,
platform: &str,
id: &str,
) -> Option<&Project> {
self
.projects
.iter()
.find(|p| p.id.get(platform).is_some_and(|pid| pid == id))
}
}
impl LockFile {
pub fn load<P: AsRef<Path>>(path: P) -> Result<Self> {
Self::load_with_validation(path, true)
@ -767,4 +720,52 @@ impl LockFile {
self.projects.push(project);
self.projects.sort_by_key(super::project::Project::get_name);
}
pub fn get_project(&self, pakku_id: &str) -> Option<&Project> {
self
.projects
.iter()
.find(|p| p.pakku_id.as_deref() == Some(pakku_id))
}
pub fn get_loader_names(&self) -> Vec<String> {
self.loaders.keys().cloned().collect()
}
pub fn remove_project(&mut self, pakku_id: &str) -> Option<Project> {
if let Some(pos) = self
.projects
.iter()
.position(|p| p.pakku_id.as_deref() == Some(pakku_id))
{
Some(self.projects.remove(pos))
} else {
None
}
}
pub fn find_project(&self, pakku_id: &str) -> Option<&Project> {
self
.projects
.iter()
.find(|p| p.pakku_id.as_deref() == Some(pakku_id))
}
pub fn find_project_mut(&mut self, pakku_id: &str) -> Option<&mut Project> {
self
.projects
.iter_mut()
.find(|p| p.pakku_id.as_deref() == Some(pakku_id))
}
pub fn find_project_by_platform_id(
&self,
platform: &str,
id: &str,
) -> Option<&Project> {
self
.projects
.iter()
.find(|p| p.id.get(platform).is_some_and(|pid| pid == id))
}
}

View file

@ -72,7 +72,6 @@ impl RateLimiter {
let interval = Duration::from_secs(60) / rate.max(1);
loop {
let mut inner = self.inner.lock().await;
let now = Instant::now();
let platform_requests =
@ -88,13 +87,15 @@ impl RateLimiter {
if wait_time > Duration::ZERO {
drop(inner);
tokio::time::sleep(wait_time).await;
continue;
}
}
let mut inner = self.inner.lock().await;
let platform_requests =
inner.requests.entry(platform.to_string()).or_default();
platform_requests.push(Instant::now());
return Ok(());
}
Ok(())
}
pub async fn wait_for(&self, platform: &str) {