pub struct Engine { /* private fields */ }Expand description
The sources a configuration resolved to, and the queries they answer.
Implementations§
Source§impl Engine
impl Engine
Sourcepub async fn task_detail(
&self,
id: &GlobalId,
) -> Result<TaskDetail, EngineError>
pub async fn task_detail( &self, id: &GlobalId, ) -> Result<TaskDetail, EngineError>
One task by its qualified id, with its comments when its source has them.
The task is read exactly as task reads it, and the comments are read
only once the task was found — a source declaring no comments is never asked.
§Errors
As task. A comment read that fails is not an error: it lands in the
response’s errors beside the task that was read.
Sourcepub async fn comments(
&self,
task: &GlobalId,
) -> Result<CommentList, EngineError>
pub async fn comments( &self, task: &GlobalId, ) -> Result<CommentList, EngineError>
Every comment on one task, oldest first.
§Errors
Returns EngineError::NoComments for a source whose tasks have none, before
anything is read; EngineError::NoSuchTask when the source holds no such task; and
EngineError::SourceFailed when the source could not answer.
Sourcepub async fn add_comment(
&self,
task: &GlobalId,
comment: &NewComment,
) -> Result<Comment, EngineError>
pub async fn add_comment( &self, task: &GlobalId, comment: &NewComment, ) -> Result<Comment, EngineError>
Add one comment to a task, answering with the comment as its source now holds it.
§Errors
As comments, plus EngineError::CommentsNotWritable for a
source whose comments cannot be written, before anything is written.
Sourcepub async fn edit_comment(
&self,
task: &GlobalId,
comment: &NativeId,
body: &CommentBody,
) -> Result<Comment, EngineError>
pub async fn edit_comment( &self, task: &GlobalId, comment: &NativeId, body: &CommentBody, ) -> Result<Comment, EngineError>
Replace one comment’s body, answering with the comment as its source now holds it.
§Errors
As add_comment, plus EngineError::NoSuchComment when the
task has no comment under comment.
Sourcepub async fn delete_comment(
&self,
task: &GlobalId,
comment: &NativeId,
) -> Result<DeletedComment, EngineError>
pub async fn delete_comment( &self, task: &GlobalId, comment: &NativeId, ) -> Result<DeletedComment, EngineError>
Source§impl Engine
impl Engine
Sourcepub async fn copy(
&self,
request: &CopyRequest,
) -> Result<CopyReport, EngineError>
pub async fn copy( &self, request: &CopyRequest, ) -> Result<CopyReport, EngineError>
Copy every item a request names into one configured destination.
This is the whole of the verb, and the command line drives exactly this: a copy a Rust caller makes and a copy typed at a shell are the same call, so the two cannot answer the same copy differently.
§Errors
Returns EngineError when the destination is not configured, cannot be built,
cannot be written, or — for a document copy — declares it has no documents; when an
id names nothing; when an origin names an item the
destination no longer holds and --recreate was not given; and when the
destination refuses the write — including a field or a metadata key it cannot
carry, which it names rather than dropping.
Source§impl Engine
impl Engine
Sourcepub async fn set_task_status(
&self,
id: &GlobalId,
category: StatusCategory,
) -> Result<TaskStatusSet, EngineError>
pub async fn set_task_status( &self, id: &GlobalId, category: StatusCategory, ) -> Result<TaskStatusSet, EngineError>
Set one task’s status, and nothing else about it, then keep every task it delivers in step with it.
§Errors
Returns EngineError::UnknownSource for a source nothing configures,
EngineError::StatusNotWritable for one with no write side,
EngineError::NoSuchTask when the task is not there, and
EngineError::SourceFailed when the source refuses — a category it has disabled
included. A delivered task that cannot be kept in step is not an error: it is reported
failed beside the status that was set.
Source§impl Engine
impl Engine
Sourcepub async fn set_task_metadata(
&self,
id: &GlobalId,
key: &MetadataKey,
value: &Value,
) -> Result<MetadataSet, EngineError>
pub async fn set_task_metadata( &self, id: &GlobalId, key: &MetadataKey, value: &Value, ) -> Result<MetadataSet, EngineError>
Set one key of one task’s metadata, and nothing else about it.
§Errors
Returns EngineError::UnknownSource for a source nothing configures,
EngineError::MetadataNotWritable for one with no write side,
EngineError::NoSuchTask when the task is not there, and
EngineError::SourceFailed when the source refuses — a plugin that cannot write one
key on its own included.
Sourcepub async fn set_project_metadata(
&self,
id: &GlobalId,
key: &MetadataKey,
value: &Value,
) -> Result<MetadataSet, EngineError>
pub async fn set_project_metadata( &self, id: &GlobalId, key: &MetadataKey, value: &Value, ) -> Result<MetadataSet, EngineError>
Set one key of one project’s metadata, and nothing else about it.
§Errors
As set_task_metadata, with
EngineError::NoSuchProject when the project is not there.
Sourcepub async fn set_document_metadata(
&self,
id: &GlobalId,
key: &MetadataKey,
value: &Value,
) -> Result<MetadataSet, EngineError>
pub async fn set_document_metadata( &self, id: &GlobalId, key: &MetadataKey, value: &Value, ) -> Result<MetadataSet, EngineError>
Set one key of one document’s metadata, and nothing else about it.
§Errors
As set_task_metadata, with EngineError::NoDocuments
for a source declaring it has none — which is never asked — and
EngineError::NoSuchDocument when the document is not there.
Source§impl Engine
impl Engine
Sourcepub async fn set_task_priority(
&self,
id: &GlobalId,
priority: Priority,
) -> Result<TaskPrioritySet, EngineError>
pub async fn set_task_priority( &self, id: &GlobalId, priority: Priority, ) -> Result<TaskPrioritySet, EngineError>
Set one task’s priority, and nothing else about it.
§Errors
Returns EngineError::UnknownSource for a source nothing configures,
EngineError::PriorityNotWritable for one with no write side,
EngineError::NoPriority for one declaring it holds no priority — neither of which
is asked — EngineError::NoSuchTask when the task is not there, and
EngineError::SourceFailed when the source refuses, a board with no option for the
priority included.
Sourcepub async fn set_task_content(
&self,
id: &GlobalId,
content: &str,
) -> Result<TaskContentSet, EngineError>
pub async fn set_task_content( &self, id: &GlobalId, content: &str, ) -> Result<TaskContentSet, EngineError>
Replace one task’s content with content, byte for byte, and nothing else about it.
§Errors
Returns EngineError::UnknownSource for a source nothing configures,
EngineError::ContentNotWritable for one with no write side, which is not asked,
EngineError::NoSuchTask when the task is not there, and
EngineError::SourceFailed when the source refuses.
Source§impl Engine
impl Engine
Sourcepub async fn create_task(
&self,
request: &TaskCreate,
) -> Result<TaskCreated, EngineError>
pub async fn create_task( &self, request: &TaskCreate, ) -> Result<TaskCreated, EngineError>
Create one task, from a plain body or a template’s rendering, and keep every task it delivers in step with it.
The content, the provenance and — where the source keeps them — the answers land in
one write. A delivered task that cannot be kept in step is not an error: it is
reported failed beside the task that was created.
§Errors
EngineError::UnknownSource and EngineError::SourceUnavailable for a source that
cannot be reached, EngineError::NotCreatable for one with no write side — neither is
written — and EngineError::SourceFailed when the source refuses the task.
Sourcepub async fn create_document(
&self,
request: &DocumentCreate,
) -> Result<Qualified<Document>, EngineError>
pub async fn create_document( &self, request: &DocumentCreate, ) -> Result<Qualified<Document>, EngineError>
Create one project document, or replace the one the source holds under
DocumentCreate::id, from a plain body or a template’s rendering.
§Errors
As create_task, and EngineError::NoDocuments for a source
declaring it has none, which is not asked.
Sourcepub async fn template_answers(
&self,
record: RenderedRecord,
id: &GlobalId,
) -> Result<TemplateAnswers, EngineError>
pub async fn template_answers( &self, record: RenderedRecord, id: &GlobalId, ) -> Result<TemplateAnswers, EngineError>
The answers the task or document id was last rendered from, as its source keeps them.
§Errors
EngineError::NoSuchTask or EngineError::NoSuchDocument when the item is not
there, EngineError::NoStoredAnswers naming it when none are stored for it — which
is every item of a source that keeps none — and EngineError::SourceFailed when the
source cannot answer.
Sourcepub async fn regeneration(
&self,
record: RenderedRecord,
id: &GlobalId,
request: &RenderRequest,
) -> Result<Regeneration, EngineError>
pub async fn regeneration( &self, record: RenderedRecord, id: &GlobalId, request: &RenderRequest, ) -> Result<Regeneration, EngineError>
Read everything a regenerate of the task or document id needs, before it renders.
§Errors
EngineError::NoSuchTask or EngineError::NoSuchDocument when the item is not
there; EngineError::NoTemplate when no template is given and the item records
none; EngineError::MalformedProvenance when no template is given and the entry it
records is not one this product writes; EngineError::TemplateNotAFile when no template is given and the one it
records is not a readable file, which only a loader document can then stand in for;
EngineError::Template when the template cannot be loaded; and the refusals of a
source that cannot be reached or cannot answer.
Sourcepub async fn regenerate(
&self,
regeneration: &Regeneration,
answers: &Answers,
dry_run: bool,
) -> Result<Regenerated, EngineError>
pub async fn regenerate( &self, regeneration: &Regeneration, answers: &Answers, dry_run: bool, ) -> Result<Regenerated, EngineError>
Render regeneration with answers laid over its base, and write the content, the
provenance and the answers in one write — and nothing else about the item — when any of
them differs from what it holds and this is not a dry run.
§Errors
Every refusal of Regeneration::render; EngineError::RenderingNotWritable for a
source with no write side, which is not asked; and EngineError::SourceFailed when
the source refuses the write.
Sourcepub async fn render_task(
&self,
id: &GlobalId,
request: &RenderRequest,
) -> Result<Regenerated, EngineError>
pub async fn render_task( &self, id: &GlobalId, request: &RenderRequest, ) -> Result<Regenerated, EngineError>
Regenerate one task in place: regeneration then
regenerate, never asking for an answer.
§Errors
Every refusal of either half.
Sourcepub async fn render_document(
&self,
id: &GlobalId,
request: &RenderRequest,
) -> Result<Regenerated, EngineError>
pub async fn render_document( &self, id: &GlobalId, request: &RenderRequest, ) -> Result<Regenerated, EngineError>
Source§impl Engine
impl Engine
Sourcepub async fn update_task(
&self,
id: &GlobalId,
update: &TaskUpdate,
) -> Result<TaskUpdated, EngineError>
pub async fn update_task( &self, id: &GlobalId, update: &TaskUpdate, ) -> Result<TaskUpdated, EngineError>
Apply a targeted update to one task — every field update names, and nothing else —
then keep every task it delivers in step with it when status or delivers was named.
The source is asked once, and nothing else of it is read: a field already holding the
requested value is sent no write, and an update in which nothing differs writes nothing
at all — an update naming no field included, which answers the task as its source reads
it and re-evaluates nothing; the CLI refuses that one as a usage error before it gets
here, a library caller is answered. update.depends_on may name its far ends qualified; one in this task’s own
source reaches the source as its native id, and each edge’s from is this task.
§Errors
Returns EngineError::UnknownSource for a source nothing configures,
EngineError::UpdateNotWritable for one with no write side,
EngineError::NoPriority for a priority other than none to a source that holds
none — neither of which is asked — EngineError::NoSuchTask when the task is not
there, and EngineError::SourceFailed carrying the source’s own SourceError when
it refuses or fails, so its class and its retry_after_seconds are what a caller
reads. An update both setting and removing one metadata key is refused that way too,
before anything is sent, in the words the source itself refuses it with. A delivered
task that cannot be kept in step is not an error: it is reported failed beside the
update that landed.
Source§impl Engine
impl Engine
Sourcepub fn build(config: &Config, secrets: &dyn SecretResolver) -> Self
pub fn build(config: &Config, secrets: &dyn SecretResolver) -> Self
Build every source a configuration names.
A source whose plugin refuses to build — a credential that is not there, a
plugin whose implementation has not landed — is not fatal: it becomes an
entry in every response’s errors, exactly as a source that fails mid-query
does, and the other sources still answer. A user with three sources and one
expired token gets the other two rather than nothing.
Sourcepub fn new(sources: Vec<ConfiguredSource>, selection: Vec<SourceName>) -> Self
pub fn new(sources: Vec<ConfiguredSource>, selection: Vec<SourceName>) -> Self
Drive sources built elsewhere — the engine’s own tests, and any caller holding a source it did not resolve from a configuration document.
Sourcepub fn listing(&self) -> Vec<SourceListing>
pub fn listing(&self) -> Vec<SourceListing>
Every configured source, whether or not it built, in name order.
Sourcepub fn has(&self, name: &SourceName) -> bool
pub fn has(&self, name: &SourceName) -> bool
Whether this configuration has a source called name, built or not.
A caller reading a --project argument needs this: urn:project:1 is a qualified
id only if urn is a source here, and a native id full of colons otherwise. That
rule cannot be applied without knowing what is configured.
Sourcepub async fn tasks(
&self,
request: &TaskRequest,
) -> Result<QueryResponse<Qualified<Task>>, EngineError>
pub async fn tasks( &self, request: &TaskRequest, ) -> Result<QueryResponse<Qualified<Task>>, EngineError>
One page of tasks.
§Errors
Returns EngineError when the request names a source nothing configures, or
carries a page token this engine did not issue. One source failing is not an
error: it lands in the response’s errors.
Sourcepub async fn projects(
&self,
request: &ProjectRequest,
) -> Result<QueryResponse<Qualified<Project>>, EngineError>
pub async fn projects( &self, request: &ProjectRequest, ) -> Result<QueryResponse<Qualified<Project>>, EngineError>
Sourcepub async fn documents(
&self,
request: &DocumentRequest,
) -> Result<QueryResponse<Qualified<Document>>, EngineError>
pub async fn documents( &self, request: &DocumentRequest, ) -> Result<QueryResponse<Qualified<Document>>, EngineError>
One page of documents.
A source declaring it has no documents is not asked: the declaration is read
once here, that source contributes no rows, and the plan reports
Predicate::Document unavailable for it. So a document list spanning a mixed set
of sources answers with what the document-bearing ones hold and says nothing
alarming about the others — the same shape a source with no project table takes.
§Errors
As tasks.
Sourcepub async fn labels(
&self,
request: &LabelRequest,
) -> Result<QueryResponse<Qualified<Label>>, EngineError>
pub async fn labels( &self, request: &LabelRequest, ) -> Result<QueryResponse<Qualified<Label>>, EngineError>
Sourcepub async fn search(
&self,
request: &SearchRequest,
) -> Result<QueryResponse<SearchHit>, EngineError>
pub async fn search( &self, request: &SearchRequest, ) -> Result<QueryResponse<SearchHit>, EngineError>
Sourcepub async fn task(
&self,
id: &GlobalId,
) -> Result<QueryResponse<Qualified<Task>>, EngineError>
pub async fn task( &self, id: &GlobalId, ) -> Result<QueryResponse<Qualified<Task>>, EngineError>
One task by its qualified id, or an empty page when there is no such task.
§Errors
Returns EngineError::UnknownSource when the id names a source nothing
configures.
Sourcepub async fn project(
&self,
id: &GlobalId,
) -> Result<QueryResponse<Qualified<Project>>, EngineError>
pub async fn project( &self, id: &GlobalId, ) -> Result<QueryResponse<Qualified<Project>>, EngineError>
Sourcepub async fn document(
&self,
id: &GlobalId,
) -> Result<QueryResponse<Qualified<Document>>, EngineError>
pub async fn document( &self, id: &GlobalId, ) -> Result<QueryResponse<Qualified<Document>>, EngineError>
One document by its qualified id, or an empty page when there is no such document.
A source declaring it has no documents holds none, so it is not asked and the
answer is the empty page with Predicate::Document reported unavailable — the
same answer the list verb gives, rather than a failure.
§Errors
As task.
Sourcepub async fn task_dependencies(
&self,
request: &DependencyRequest,
) -> Result<QueryResponse<QualifiedEdge>, EngineError>
pub async fn task_dependencies( &self, request: &DependencyRequest, ) -> Result<QueryResponse<QualifiedEdge>, EngineError>
One page of a task’s dependency edges.
§Errors
As task, plus EngineError::Token for a page token this engine
did not issue.