pub trait MutationBackend: Send + Sync {
Show 25 methods
// Required methods
fn create_task<'life0, 'async_trait>(
&'life0 self,
request: CreateTaskRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<ThingsId>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn bulk_create_tasks<'life0, 'async_trait>(
&'life0 self,
request: BulkCreateTasksRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn update_task<'life0, 'async_trait>(
&'life0 self,
request: UpdateTaskRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn complete_task<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait;
fn uncomplete_task<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait;
fn delete_task<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
child_handling: DeleteChildHandling,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait;
fn bulk_delete<'life0, 'async_trait>(
&'life0 self,
request: BulkDeleteRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn bulk_move<'life0, 'async_trait>(
&'life0 self,
request: BulkMoveRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn bulk_update_dates<'life0, 'async_trait>(
&'life0 self,
request: BulkUpdateDatesRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn bulk_complete<'life0, 'async_trait>(
&'life0 self,
request: BulkCompleteRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn create_project<'life0, 'async_trait>(
&'life0 self,
request: CreateProjectRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<ThingsId>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn update_project<'life0, 'async_trait>(
&'life0 self,
request: UpdateProjectRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn complete_project<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
child_handling: ProjectChildHandling,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait;
fn delete_project<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
child_handling: ProjectChildHandling,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait;
fn create_area<'life0, 'async_trait>(
&'life0 self,
request: CreateAreaRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<ThingsId>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn update_area<'life0, 'async_trait>(
&'life0 self,
request: UpdateAreaRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn delete_area<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait;
fn create_tag<'life0, 'async_trait>(
&'life0 self,
request: CreateTagRequest,
force: bool,
) -> Pin<Box<dyn Future<Output = ThingsResult<TagCreationResult>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn update_tag<'life0, 'async_trait>(
&'life0 self,
request: UpdateTagRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
fn delete_tag<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
remove_from_tasks: bool,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait;
fn merge_tags<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
source_id: &'life1 ThingsId,
target_id: &'life2 ThingsId,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait;
fn add_tag_to_task<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
task_id: &'life1 ThingsId,
tag_title: &'life2 str,
) -> Pin<Box<dyn Future<Output = ThingsResult<TagAssignmentResult>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait;
fn remove_tag_from_task<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
task_id: &'life1 ThingsId,
tag_title: &'life2 str,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait;
fn set_task_tags<'life0, 'life1, 'async_trait>(
&'life0 self,
task_id: &'life1 ThingsId,
tag_titles: Vec<String>,
) -> Pin<Box<dyn Future<Output = ThingsResult<Vec<TagMatch>>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait;
// Provided method
fn kind(&self) -> &'static str { ... }
}Expand description
Abstraction over every Things 3 mutation operation exposed as an MCP tool.
All implementations must be Send + Sync so the server can share them across
async tasks via Arc<dyn MutationBackend>.
Required Methods§
fn create_task<'life0, 'async_trait>(
&'life0 self,
request: CreateTaskRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<ThingsId>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Sourcefn bulk_create_tasks<'life0, 'async_trait>(
&'life0 self,
request: BulkCreateTasksRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_create_tasks<'life0, 'async_trait>(
&'life0 self,
request: BulkCreateTasksRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Create multiple tasks in one call. Best-effort and non-atomic — per-item
failures are reported via BulkOperationResult.
fn update_task<'life0, 'async_trait>(
&'life0 self,
request: UpdateTaskRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn complete_task<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn uncomplete_task<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn delete_task<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
child_handling: DeleteChildHandling,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn bulk_delete<'life0, 'async_trait>(
&'life0 self,
request: BulkDeleteRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_move<'life0, 'async_trait>(
&'life0 self,
request: BulkMoveRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_update_dates<'life0, 'async_trait>(
&'life0 self,
request: BulkUpdateDatesRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_complete<'life0, 'async_trait>(
&'life0 self,
request: BulkCompleteRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<BulkOperationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn create_project<'life0, 'async_trait>(
&'life0 self,
request: CreateProjectRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<ThingsId>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn update_project<'life0, 'async_trait>(
&'life0 self,
request: UpdateProjectRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn complete_project<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
child_handling: ProjectChildHandling,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn delete_project<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
child_handling: ProjectChildHandling,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn create_area<'life0, 'async_trait>(
&'life0 self,
request: CreateAreaRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<ThingsId>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn update_area<'life0, 'async_trait>(
&'life0 self,
request: UpdateAreaRequest,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn delete_area<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 ThingsId,
) -> Pin<Box<dyn Future<Output = ThingsResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Sourcefn create_tag<'life0, 'async_trait>(
&'life0 self,
request: CreateTagRequest,
force: bool,
) -> Pin<Box<dyn Future<Output = ThingsResult<TagCreationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn create_tag<'life0, 'async_trait>(
&'life0 self,
request: CreateTagRequest,
force: bool,
) -> Pin<Box<dyn Future<Output = ThingsResult<TagCreationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Create a tag. When force is true, skip duplicate / similarity checks
(mirrors the legacy create_tag_force path); otherwise run the smart
flow that may return Existing or SimilarFound.