normalize_package_index/index/
mod.rs1mod types;
10
11#[cfg(test)]
12mod tests;
13
14pub 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
35pub mod choco;
37pub mod msys2;
38pub mod scoop;
39pub mod winget;
40
41pub mod brew;
43pub mod homebrew_casks;
44pub mod macports;
45
46pub mod flatpak;
48pub mod snap;
49
50pub mod docker;
52
53pub mod fdroid;
55pub mod termux;
56
57pub 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 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 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 &brew::Brew,
147 &homebrew_casks::HomebrewCasks,
148 &macports::MacPorts,
149 FLATPAK_INDEX.get_or_init(flatpak::Flatpak::all),
151 SNAP_INDEX.get_or_init(snap::Snap::all),
152 DOCKER_INDEX.get_or_init(docker::Docker::all),
154 FDROID_INDEX.get_or_init(fdroid::FDroid::all),
156 &termux::Termux,
157 &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
189pub 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
195pub 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
201pub fn all_indices() -> Vec<&'static dyn PackageIndex> {
203 INDEX_REGISTRY.get_or_init(init_builtin).clone()
204}