pub struct IngestConfig<'a> {
pub paths: &'a PathPolicy,
pub prose: bool,
pub pdf: bool,
pub ocr: bool,
pub vision: bool,
pub audio: bool,
}Expand description
What roteiro sync ingests: which paths it reads (ADR-0007 [paths]),
and which content classes it extracts within them (ADR-0007 [ingest]).
Every toggle defaults to on, and a toggle only gates content within a
build that supports it — turning pdf on cannot extract PDF text in a
binary built without the pdf-text feature, but turning it off suppresses
that content in a binary that has it.
§Why the path policy travels here
Self::paths answers a different question from the toggles — which files
rather than how much of a file — and it is carried in the same value
deliberately. This struct already reaches every entry point that reads
repository bytes, and crate::paths is a rule that is only correct if
every such reader consults it: an exclusion honoured by extraction and
not by the authored classifier leaves a committed markdown file under an
excluded path still able to be parsed as one of our ADRs (issue #817). A
reader that has the ingestion configuration therefore cannot fail to have the
path policy too, and adding a reader does not mean remembering to thread a
second parameter to it.
It is a borrow rather than an owned list so this stays Copy, which is
what lets it keep travelling by value through the call graph it already
travels through. PathPolicy::empty is 'static, so default() needs no
caller-supplied storage.
The five toggles split into two groups, and the split is the ADR-0015 boundary:
prose,pdfandocrgate extraction: what is decoded from the bytes intometa.contentas aderivedfact. They contribute to the extraction cache key, because turning one off changes what extraction produces.visionandaudiogate generation: whetherroteiro media buildmay invoke a model at all. They no longer touch extraction, so they contribute nothing to the cache key — a repository that setsaudio = falsegets exactly the derived facts it would get with it on.
Fields§
§paths: &'a PathPolicyWhich repository paths are read at all, and how much of each is mined —
ADR-0007 [paths]. Empty by default, which is exactly today’s behaviour.
prose: boolEmbed the UTF-8 body of prose files (Markdown, plain text).
pdf: boolExtract text from PDF documents (needs the pdf-text feature).
ocr: boolOCR literal text from images (needs the image-ocr feature).
vision: boolAllow roteiro media build to describe images with a vision model (needs
the image-vision feature). Since ADR-0015 this gates generation, not
extraction: a description is never written to meta.content.
audio: boolAllow roteiro media build to transcribe spoken-word audio (needs the
audio-transcribe feature). Gates generation, as vision does.
Implementations§
Source§impl IngestConfig<'_>
impl IngestConfig<'_>
Sourcepub fn with_paths<'b>(self, paths: &'b PathPolicy) -> IngestConfig<'b>
pub fn with_paths<'b>(self, paths: &'b PathPolicy) -> IngestConfig<'b>
The same content toggles over a different path policy.
Exists for the one shape a borrowed policy makes awkward: a 'static
callback (the sync-on-access hook a serve workspace installs) cannot
capture a value borrowing from main’s stack, so it owns a clone of the
policy and rebinds the toggles onto it per call. Rebinding rather than
reconstructing field-by-field keeps the toggles in one place, so a sixth
toggle does not have to be remembered here.
§The result’s lifetime is the argument’s, not the receiver’s
'b is independent of 'a deliberately, and tying them together is a
compile error one feature flag away. The caller this exists for holds a
short-lived IngestConfig and needs a 'static one to move into a
callback: ingest.with_paths(PathPolicy::empty()) must yield
IngestConfig<'static>, which it can only do if the result follows the
'static argument rather than the borrowed receiver. Unified, the result
takes the receiver’s shorter lifetime, the callback stops being 'static,
and roteiro serve no longer builds — which is exactly what happened
(PR #850: green on the default feature set, red on MSRV and on
--no-default-features --features mcp, where this code is compiled).
Sourcepub fn class(&self, path: &str) -> PathClass
pub fn class(&self, path: &str) -> PathClass
How path is read — the shared answer both this crate’s extraction and
rto_spec’s authored classifier act on. See crate::paths.
Trait Implementations§
Source§impl<'a> Clone for IngestConfig<'a>
impl<'a> Clone for IngestConfig<'a>
impl<'a> Copy for IngestConfig<'a>
Source§impl<'a> Debug for IngestConfig<'a>
impl<'a> Debug for IngestConfig<'a>
Source§impl Default for IngestConfig<'_>
impl Default for IngestConfig<'_>
impl<'a> Eq for IngestConfig<'a>
Source§impl<'a> PartialEq for IngestConfig<'a>
impl<'a> PartialEq for IngestConfig<'a>
impl<'a> StructuralPartialEq for IngestConfig<'a>
Auto Trait Implementations§
impl<'a> Freeze for IngestConfig<'a>
impl<'a> RefUnwindSafe for IngestConfig<'a>
impl<'a> Send for IngestConfig<'a>
impl<'a> Sync for IngestConfig<'a>
impl<'a> Unpin for IngestConfig<'a>
impl<'a> UnsafeUnpin for IngestConfig<'a>
impl<'a> UnwindSafe for IngestConfig<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.