#[non_exhaustive]pub struct FetchPaperOutcome {
pub source: String,
pub resolver_profile: String,
pub license: String,
pub path: Utf8PathBuf,
pub size_bytes: u64,
pub schema_version: String,
pub pdf_leg: PdfLegStatus,
pub safekey: String,
pub canonical_digest: String,
}Expand description
What fetch_paper wrote to disk and how.
path is the PDF (<root>/<safekey>.pdf) on a successful PDF
fetch, or the metadata TOML (<root>/.metadata/<safekey>.toml)
when the DOI path fell back to metadata-only. Self::pdf_leg
disambiguates why there is no PDF (genuinely none available vs.
available-but-blocked) so callers never report a blocked PDF as a
silent success (issue #118).
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.source: StringSource::name() of the resolver whose payload landed on disk:
"arxiv" for an arXiv ref, "oa-publisher" when the DOI OA PDF
leg succeeded, or "crossref" / "unpaywall" when the DOI path
fell back to metadata-only. Mirrors the value written to
[doiget].source in the metadata TOML.
resolver_profile: StringResolver profile under which the canonical-digest (ADR-0021 §1)
was minted for the final artifact. For an arXiv fetch this is
"arxiv"; for a successful DOI OA PDF leg this is
"oa-publisher"; for the DOI metadata-only fallback this is the
metadata source key ("crossref" / "unpaywall"). Equal to
Self::source verbatim in Slice 4 but kept distinct so future
slices can decouple “which resolver wrote to disk” from “which
resolver is the audit identity”. Surfaced through the
doiget_fetch_paper MCP envelope per ADR-0021 §4.
license: StringOA license string ("CC-BY-4.0", "cc-by", "arxiv-default",
"unknown"). Mirrors [doiget].license.
path: Utf8PathBufAbsolute path of the artifact actually written
(<root>/<safekey>.pdf on success, <root>/.metadata/<safekey>.toml
on metadata-only fallback).
size_bytes: u64Stored PDF size in bytes; 0 on the metadata-only fallback
(docs/REDIRECT_ALLOWLIST.md §3.5).
schema_version: StringThe schema version of the metadata TOML written
(always crate::SCHEMA_VERSION for this build).
pdf_leg: PdfLegStatusWhat happened on the PDF leg (issue #118). Fetched /
NoOaUrl are clean outcomes; Blocked carries the structured
reason an OA PDF existed but could not be retrieved, so the
CLI / MCP surface it instead of a silent metadata-only success.
safekey: StringPer-ref crate::Safekey stringified (Ref::safekey().as_str()).
Exposed on the outcome so JSON-mode CLI / MCP callers can
emit a structured success body without re-parsing the input
ref (#210 / docs/ERRORS.md §3). Always populated.
canonical_digest: StringADR-0021 §1 canonical-digest as 64-char lowercase hex for the
resolver_profile that produced this outcome’s audit identity.
For an arXiv fetch this is the digest under "arxiv"; for a
DOI OA PDF leg this is under "oa-publisher"; for the DOI
metadata-only fallback this is under the metadata source key
("crossref" / "unpaywall"). Always populated.
Trait Implementations§
Source§impl Clone for FetchPaperOutcome
impl Clone for FetchPaperOutcome
Source§fn clone(&self) -> FetchPaperOutcome
fn clone(&self) -> FetchPaperOutcome
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more