use async_trait::async_trait;
use crate::error::Result as ThingsResult;
use crate::models::{
BulkCompleteRequest, BulkCreateTasksRequest, BulkDeleteRequest, BulkMoveRequest,
BulkOperationResult, BulkUpdateDatesRequest, CreateAreaRequest, CreateProjectRequest,
CreateTagRequest, CreateTaskRequest, DeleteChildHandling, ProjectChildHandling,
TagAssignmentResult, TagCreationResult, TagMatch, ThingsId, UpdateAreaRequest,
UpdateProjectRequest, UpdateTagRequest, UpdateTaskRequest,
};
mod sqlx;
pub use sqlx::SqlxBackend;
#[cfg(target_os = "macos")]
mod applescript;
#[cfg(target_os = "macos")]
pub use applescript::AppleScriptBackend;
#[async_trait]
pub trait MutationBackend: Send + Sync {
fn kind(&self) -> &'static str {
"unknown"
}
async fn create_task(&self, request: CreateTaskRequest) -> ThingsResult<ThingsId>;
async fn bulk_create_tasks(
&self,
request: BulkCreateTasksRequest,
) -> ThingsResult<BulkOperationResult>;
async fn update_task(&self, request: UpdateTaskRequest) -> ThingsResult<()>;
async fn complete_task(&self, id: &ThingsId) -> ThingsResult<()>;
async fn uncomplete_task(&self, id: &ThingsId) -> ThingsResult<()>;
async fn delete_task(
&self,
id: &ThingsId,
child_handling: DeleteChildHandling,
) -> ThingsResult<()>;
async fn bulk_delete(&self, request: BulkDeleteRequest) -> ThingsResult<BulkOperationResult>;
async fn bulk_move(&self, request: BulkMoveRequest) -> ThingsResult<BulkOperationResult>;
async fn bulk_update_dates(
&self,
request: BulkUpdateDatesRequest,
) -> ThingsResult<BulkOperationResult>;
async fn bulk_complete(
&self,
request: BulkCompleteRequest,
) -> ThingsResult<BulkOperationResult>;
async fn create_project(&self, request: CreateProjectRequest) -> ThingsResult<ThingsId>;
async fn update_project(&self, request: UpdateProjectRequest) -> ThingsResult<()>;
async fn complete_project(
&self,
id: &ThingsId,
child_handling: ProjectChildHandling,
) -> ThingsResult<()>;
async fn delete_project(
&self,
id: &ThingsId,
child_handling: ProjectChildHandling,
) -> ThingsResult<()>;
async fn create_area(&self, request: CreateAreaRequest) -> ThingsResult<ThingsId>;
async fn update_area(&self, request: UpdateAreaRequest) -> ThingsResult<()>;
async fn delete_area(&self, id: &ThingsId) -> ThingsResult<()>;
async fn create_tag(
&self,
request: CreateTagRequest,
force: bool,
) -> ThingsResult<TagCreationResult>;
async fn update_tag(&self, request: UpdateTagRequest) -> ThingsResult<()>;
async fn delete_tag(&self, id: &ThingsId, remove_from_tasks: bool) -> ThingsResult<()>;
async fn merge_tags(&self, source_id: &ThingsId, target_id: &ThingsId) -> ThingsResult<()>;
async fn add_tag_to_task(
&self,
task_id: &ThingsId,
tag_title: &str,
) -> ThingsResult<TagAssignmentResult>;
async fn remove_tag_from_task(&self, task_id: &ThingsId, tag_title: &str) -> ThingsResult<()>;
async fn set_task_tags(
&self,
task_id: &ThingsId,
tag_titles: Vec<String>,
) -> ThingsResult<Vec<TagMatch>>;
}