Skip to main content

pacenotes_server/store/
requires_check.rs

1/// Every `requires` entry that is malformed, has no package in the requiring
2/// package's own game, or leads a public package to a protected one.
3pub fn requires_problems(manifest: &pacenotes_shared::Manifest) -> Vec<String> {
4    let mut problems = Vec::new();
5    for package in &manifest.packages {
6        let owner = format!("{}/{}", package.directory, package.name);
7        for text in &package.requires {
8            let Some(reference) = pacenotes_shared::PackageRef::parse(text) else {
9                problems.push(format!(
10                    "{owner} requires {text:?}, which is not a \"directory/name\" reference"
11                ));
12                continue;
13            };
14            let Some(dependency) = manifest.get(&package.game, &reference) else {
15                problems.push(format!(
16                    "{} {owner} requires {reference}, which does not exist in game {}",
17                    package.game, package.game
18                ));
19                continue;
20            };
21            if package.is_public() && !dependency.is_public() {
22                problems.push(format!(
23                    "{owner} is public but requires {reference}, which is not — \
24                     anonymous users would see a package they cannot complete"
25                ));
26            }
27        }
28    }
29    problems
30}