Skip to main content

normalize_package_index/index/
mod.rs

1//! Package index ingestion for cross-platform package mapping.
2//!
3//! This module provides fetchers that pull metadata from package manager indices
4//! (apt Sources, brew API, crates.io, etc.) to extract package information.
5//!
6//! Unlike the `ecosystem` feature which is project-focused (dependencies of a project),
7//! this is registry-focused (what packages exist and what's their metadata).
8
9mod types;
10
11#[cfg(test)]
12mod tests;
13
14// Distro package managers
15pub mod apk;
16pub mod apt;
17mod arch_common;
18pub mod artix;
19pub mod cachyos;
20pub mod chaotic_aur;
21pub mod copr;
22pub mod dnf;
23pub mod endeavouros;
24pub mod freebsd;
25pub mod gentoo;
26pub mod guix;
27pub mod manjaro;
28pub mod nix;
29pub mod opensuse;
30pub mod pacman;
31pub mod slackware;
32pub mod ubuntu;
33pub mod void;
34
35// Windows package managers
36pub mod choco;
37pub mod msys2;
38pub mod scoop;
39pub mod winget;
40
41// macOS
42pub mod brew;
43pub mod homebrew_casks;
44pub mod macports;
45
46// Cross-platform app stores
47pub mod flatpak;
48pub mod snap;
49
50// Containers
51pub mod docker;
52
53// Mobile
54pub mod fdroid;
55pub mod termux;
56
57// Language package managers
58pub mod bioconductor;
59pub mod cargo;
60pub mod clojars;
61pub mod composer;
62pub mod conan;
63pub mod conda;
64pub mod cran;
65pub mod ctan;
66pub mod deno;
67pub mod dub;
68pub mod gem;
69pub mod go;
70pub mod hackage;
71pub mod hex;
72pub mod hunter;
73pub mod jsr;
74pub mod julia;
75pub mod luarocks;
76pub mod maven;
77pub mod metacpan;
78pub mod nimble;
79pub mod npm;
80pub mod nuget;
81pub mod opam;
82pub mod pip;
83pub mod pub_dev;
84pub mod racket;
85pub mod vcpkg;
86
87pub use types::{IndexError, PackageIndex, PackageIter, PackageMeta, VersionMeta};
88
89use std::sync::OnceLock;
90
91static INDEX_REGISTRY: OnceLock<Vec<&'static dyn PackageIndex>> = OnceLock::new();
92static OPENSUSE_INDEX: OnceLock<opensuse::OpenSuse> = OnceLock::new();
93static PACMAN_INDEX: OnceLock<pacman::Pacman> = OnceLock::new();
94static ARTIX_INDEX: OnceLock<artix::Artix> = OnceLock::new();
95static APK_INDEX: OnceLock<apk::Apk> = OnceLock::new();
96static FREEBSD_INDEX: OnceLock<freebsd::FreeBsd> = OnceLock::new();
97static VOID_INDEX: OnceLock<void::Void> = OnceLock::new();
98static MANJARO_INDEX: OnceLock<manjaro::Manjaro> = OnceLock::new();
99static APT_INDEX: OnceLock<apt::Apt> = OnceLock::new();
100static DNF_INDEX: OnceLock<dnf::Dnf> = OnceLock::new();
101static UBUNTU_INDEX: OnceLock<ubuntu::Ubuntu> = OnceLock::new();
102static NIX_INDEX: OnceLock<nix::Nix> = OnceLock::new();
103static CACHYOS_INDEX: OnceLock<cachyos::CachyOs> = OnceLock::new();
104static ENDEAVOUROS_INDEX: OnceLock<endeavouros::EndeavourOs> = OnceLock::new();
105static GENTOO_INDEX: OnceLock<gentoo::Gentoo> = OnceLock::new();
106static GUIX_INDEX: OnceLock<guix::Guix> = OnceLock::new();
107static SLACKWARE_INDEX: OnceLock<slackware::Slackware> = OnceLock::new();
108static SCOOP_INDEX: OnceLock<scoop::Scoop> = OnceLock::new();
109static CHOCO_INDEX: OnceLock<choco::Choco> = OnceLock::new();
110static WINGET_INDEX: OnceLock<winget::Winget> = OnceLock::new();
111static FLATPAK_INDEX: OnceLock<flatpak::Flatpak> = OnceLock::new();
112static SNAP_INDEX: OnceLock<snap::Snap> = OnceLock::new();
113static CONDA_INDEX: OnceLock<conda::Conda> = OnceLock::new();
114static MAVEN_INDEX: OnceLock<maven::Maven> = OnceLock::new();
115static DOCKER_INDEX: OnceLock<docker::Docker> = OnceLock::new();
116static FDROID_INDEX: OnceLock<fdroid::FDroid> = OnceLock::new();
117static MSYS2_INDEX: OnceLock<msys2::Msys2> = OnceLock::new();
118
119fn init_builtin() -> Vec<&'static dyn PackageIndex> {
120    vec![
121        // Distro
122        APK_INDEX.get_or_init(apk::Apk::all),
123        APT_INDEX.get_or_init(apt::Apt::all),
124        ARTIX_INDEX.get_or_init(artix::Artix::all),
125        CACHYOS_INDEX.get_or_init(cachyos::CachyOs::all),
126        &chaotic_aur::ChaoticAur,
127        &copr::Copr,
128        DNF_INDEX.get_or_init(dnf::Dnf::all),
129        ENDEAVOUROS_INDEX.get_or_init(endeavouros::EndeavourOs::all),
130        FREEBSD_INDEX.get_or_init(freebsd::FreeBsd::all),
131        GENTOO_INDEX.get_or_init(gentoo::Gentoo::all),
132        GUIX_INDEX.get_or_init(guix::Guix::all),
133        MANJARO_INDEX.get_or_init(manjaro::Manjaro::all),
134        NIX_INDEX.get_or_init(nix::Nix::all),
135        OPENSUSE_INDEX.get_or_init(opensuse::OpenSuse::all),
136        PACMAN_INDEX.get_or_init(pacman::Pacman::all),
137        SLACKWARE_INDEX.get_or_init(slackware::Slackware::all),
138        UBUNTU_INDEX.get_or_init(ubuntu::Ubuntu::all),
139        VOID_INDEX.get_or_init(void::Void::all),
140        // Windows
141        CHOCO_INDEX.get_or_init(choco::Choco::all),
142        MSYS2_INDEX.get_or_init(msys2::Msys2::all),
143        SCOOP_INDEX.get_or_init(scoop::Scoop::all),
144        WINGET_INDEX.get_or_init(winget::Winget::all),
145        // macOS
146        &brew::Brew,
147        &homebrew_casks::HomebrewCasks,
148        &macports::MacPorts,
149        // Cross-platform
150        FLATPAK_INDEX.get_or_init(flatpak::Flatpak::all),
151        SNAP_INDEX.get_or_init(snap::Snap::all),
152        // Containers
153        DOCKER_INDEX.get_or_init(docker::Docker::all),
154        // Mobile
155        FDROID_INDEX.get_or_init(fdroid::FDroid::all),
156        &termux::Termux,
157        // Language
158        &bioconductor::Bioconductor,
159        &vcpkg::Vcpkg,
160        &clojars::Clojars,
161        &cargo::CargoIndex,
162        &ctan::Ctan,
163        &composer::Composer,
164        &conan::Conan,
165        CONDA_INDEX.get_or_init(conda::Conda::all),
166        &cran::Cran,
167        &deno::Deno,
168        &dub::Dub,
169        &gem::Gem,
170        &go::Go,
171        &hackage::Hackage,
172        &hex::Hex,
173        &hunter::Hunter,
174        &jsr::Jsr,
175        &julia::Julia,
176        &luarocks::LuaRocks,
177        MAVEN_INDEX.get_or_init(maven::Maven::all),
178        &metacpan::MetaCpan,
179        &nimble::Nimble,
180        &npm::NpmIndex,
181        &nuget::Nuget,
182        &opam::Opam,
183        &pip::PipIndex,
184        &pub_dev::Pub,
185        &racket::Racket,
186    ]
187}
188
189/// Get a package index by ecosystem name.
190pub fn get_index(name: &str) -> Option<&'static dyn PackageIndex> {
191    let registry = INDEX_REGISTRY.get_or_init(init_builtin);
192    registry.iter().find(|idx| idx.ecosystem() == name).copied()
193}
194
195/// List all available package index ecosystem names.
196pub fn list_indices() -> Vec<&'static str> {
197    let registry = INDEX_REGISTRY.get_or_init(init_builtin);
198    registry.iter().map(|idx| idx.ecosystem()).collect()
199}
200
201/// Get all registered package indices.
202pub fn all_indices() -> Vec<&'static dyn PackageIndex> {
203    INDEX_REGISTRY.get_or_init(init_builtin).clone()
204}