1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//! Source implementations.
//!
//! Each source is a concrete `Source` trait impl. Per `docs/SOURCES.md` §1:
//!
//! - Tier 1 (Open Access, always compiled in): Crossref / Unpaywall / arXiv.
//! - Tier 2 (metadata enrichment, Phase 4, behind the `metadata` Cargo
//! feature): OpenAlex / Semantic Scholar / DOAJ / DataCite / HAL / OpenAIRE / CORE / Europe PMC.
//! - Tier 3 (TDM, Phase 5, behind per-publisher Cargo features):
//! Springer Nature OA / APS Harvest / Elsevier ScienceDirect.
// ---------------------------------------------------------------------------
// Tier 2 (Phase 4) — compile-gated by the `metadata` Cargo feature.
// ---------------------------------------------------------------------------
/// DataCite — DOI **resolution** for the second registration agency
/// (Zenodo / figshare / Dryad / OSF). Not enrichment: without it those
/// DOIs report `NotFound`. Runtime-gated by `DOIGET_ENABLE_DATACITE`,
/// off by default (ADR-0040, #414).
/// HAL — the French national OA repository. Author deposits in maths /
/// physics / CS that Crossref-centric indexes miss. Runtime-gated by
/// `DOIGET_ENABLE_HAL`, off by default (ADR-0040, #418).
/// OpenAIRE — European institutional / funder repository aggregation via
/// the Graph API v1 (the legacy search endpoint is unstable and unused).
/// Mixed access rights, so only COAR OPEN records are returned.
/// Runtime-gated by `DOIGET_ENABLE_OPENAIRE`, off by default (#416).
/// CORE — cross-repository OA aggregation, the broadest single OA index
/// outside Unpaywall and therefore the LAST fallback in the chain. Takes
/// an optional free key from `DOIGET_CORE_API_KEY`; absent, it degrades
/// to the key-less rate limit. Runtime-gated by `DOIGET_ENABLE_CORE`,
/// off by default (#417). Named `core_oa` because `core` is a built-in
/// crate name.
/// Europe PMC — biomedical OA full text the Crossref-centric Unpaywall
/// index misses. OA subset only (`isOpenAccess`, not `inEPMC`); the PDF
/// it points at is fetched by the existing `oa-publisher` leg, not here.
/// Runtime-gated by `DOIGET_ENABLE_EUROPE_PMC`, off by default (#415).
// ---------------------------------------------------------------------------
// Tier 3 (Phase 5) — compile-gated by per-publisher Cargo features.
// Default release binaries ship NONE of these; opt-in builds enable one
// or more via `--features tdm-<publisher>` (ADR-0002).
// ---------------------------------------------------------------------------