use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum DetailLevel {
Minimal,
#[default]
Default,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct WorkspacesParams {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ResourceType {
Project,
Portfolio,
Task,
#[serde(rename = "workspace_favorites", alias = "favorites")]
WorkspaceFavorites,
#[serde(rename = "project_tasks", alias = "tasks")]
ProjectTasks,
#[serde(rename = "task_subtasks", alias = "subtasks")]
TaskSubtasks,
#[serde(rename = "task_comments", alias = "comments")]
TaskComments,
#[serde(rename = "status_update")]
StatusUpdate,
#[serde(rename = "status_updates")]
StatusUpdates,
#[serde(rename = "all_workspaces", alias = "workspaces")]
AllWorkspaces,
Workspace,
#[serde(rename = "workspace_templates", alias = "project_templates")]
WorkspaceTemplates,
ProjectTemplate,
#[serde(rename = "project_sections", alias = "sections")]
ProjectSections,
Section,
#[serde(rename = "workspace_tags", alias = "tags")]
WorkspaceTags,
Tag,
#[serde(rename = "my_tasks", alias = "my_assigned_tasks")]
MyTasks,
#[serde(rename = "workspace_projects", alias = "projects")]
WorkspaceProjects,
#[serde(alias = "current_user")]
Me,
User,
#[serde(rename = "workspace_users", alias = "users")]
WorkspaceUsers,
Team,
#[serde(rename = "workspace_teams", alias = "teams")]
WorkspaceTeams,
TeamUsers,
#[serde(rename = "project_custom_fields", alias = "custom_fields")]
ProjectCustomFields,
#[serde(rename = "project_brief")]
ProjectBrief,
#[serde(rename = "project_project_brief")]
ProjectProjectBrief,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct GetParams {
pub resource_type: ResourceType,
#[serde(default)]
pub gid: Option<String>,
#[serde(default)]
pub depth: Option<i32>,
#[serde(default)]
pub subtask_depth: Option<i32>,
#[serde(default)]
pub include_subtasks: Option<bool>,
#[serde(default)]
pub include_dependencies: Option<bool>,
#[serde(default)]
pub include_comments: Option<bool>,
#[serde(default)]
pub detail_level: DetailLevel,
#[serde(default)]
pub extra_fields: Option<Vec<String>>,
#[serde(default)]
pub opt_fields: Option<Vec<String>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum CreateResourceType {
Task,
Subtask,
Project,
#[serde(rename = "project_from_template")]
ProjectFromTemplate,
Portfolio,
Section,
Comment,
#[serde(rename = "status_update")]
StatusUpdate,
Tag,
#[serde(rename = "project_duplicate")]
ProjectDuplicate,
#[serde(rename = "task_duplicate")]
TaskDuplicate,
#[serde(rename = "project_brief")]
ProjectBrief,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema)]
pub struct DateVariableParam {
pub gid: String,
pub value: String,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema)]
pub struct RoleAssignmentParam {
pub gid: String,
pub value: String,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct CreateParams {
pub resource_type: CreateResourceType,
#[serde(default)]
pub workspace_gid: Option<String>,
#[serde(default)]
pub project_gid: Option<String>,
#[serde(default)]
pub task_gid: Option<String>,
#[serde(default)]
pub team_gid: Option<String>,
#[serde(default)]
pub parent_gid: Option<String>,
#[serde(default)]
pub template_gid: Option<String>,
#[serde(default)]
pub requested_dates: Option<Vec<DateVariableParam>>,
#[serde(default)]
pub requested_roles: Option<Vec<RoleAssignmentParam>>,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub notes: Option<String>,
#[serde(default)]
pub html_notes: Option<String>,
#[serde(default)]
pub color: Option<String>,
#[serde(default)]
pub due_on: Option<String>,
#[serde(default)]
pub start_on: Option<String>,
#[serde(default)]
pub assignee: Option<String>,
#[serde(default)]
pub privacy_setting: Option<String>,
#[serde(default)]
pub public: Option<bool>,
#[serde(default)]
pub status_type: Option<String>,
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub text: Option<String>,
#[serde(default)]
pub html_text: Option<String>,
#[serde(default)]
pub custom_fields: Option<HashMap<String, serde_json::Value>>,
#[serde(default)]
pub source_gid: Option<String>,
#[serde(default)]
pub include: Option<Vec<String>>,
#[serde(default)]
pub opt_fields: Option<Vec<String>>,
}
#[derive(Debug, Default, Deserialize, JsonSchema)]
pub struct TaskSearchParams {
#[serde(default)]
pub workspace_gid: Option<String>,
#[serde(default)]
pub text: Option<String>,
#[serde(default)]
pub assignee: Option<String>,
#[serde(default)]
pub projects: Option<Vec<String>>,
#[serde(default)]
pub tags: Option<Vec<String>>,
#[serde(default)]
pub sections: Option<Vec<String>>,
#[serde(default)]
pub completed: Option<bool>,
#[serde(default)]
pub due_on: Option<String>,
#[serde(default)]
pub due_on_before: Option<String>,
#[serde(default)]
pub due_on_after: Option<String>,
#[serde(default)]
pub start_on: Option<String>,
#[serde(default)]
pub start_on_before: Option<String>,
#[serde(default)]
pub start_on_after: Option<String>,
#[serde(default)]
pub modified_at_after: Option<String>,
#[serde(default)]
pub modified_at_before: Option<String>,
#[serde(default)]
pub portfolios: Option<Vec<String>>,
#[serde(default)]
pub sort_by: Option<String>,
#[serde(default)]
pub sort_ascending: Option<bool>,
#[serde(default)]
pub detail_level: DetailLevel,
#[serde(default)]
pub extra_fields: Option<Vec<String>>,
#[serde(default)]
pub opt_fields: Option<Vec<String>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SearchableResourceType {
Project,
#[serde(rename = "project_template")]
ProjectTemplate,
Portfolio,
User,
Team,
Tag,
Goal,
}
impl SearchableResourceType {
pub fn as_str(&self) -> &'static str {
match self {
Self::Project => "project",
Self::ProjectTemplate => "project_template",
Self::Portfolio => "portfolio",
Self::User => "user",
Self::Team => "team",
Self::Tag => "tag",
Self::Goal => "goal",
}
}
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct ResourceSearchParams {
pub query: Option<String>,
pub resource_type: SearchableResourceType,
#[serde(default)]
pub workspace_gid: Option<String>,
#[serde(default)]
pub count: Option<u32>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum UpdateResourceType {
Task,
Project,
Portfolio,
Section,
Tag,
Comment,
#[serde(rename = "status_update")]
StatusUpdate,
#[serde(rename = "project_brief")]
ProjectBrief,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct UpdateParams {
pub resource_type: UpdateResourceType,
pub gid: String,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub notes: Option<String>,
#[serde(default)]
pub html_notes: Option<String>,
#[serde(default)]
pub completed: Option<bool>,
#[serde(default)]
pub due_on: Option<String>,
#[serde(default)]
pub start_on: Option<String>,
#[serde(default)]
pub assignee: Option<String>,
#[serde(default)]
pub color: Option<String>,
#[serde(default)]
pub archived: Option<bool>,
#[serde(default)]
pub privacy_setting: Option<String>,
#[serde(default)]
pub public: Option<bool>,
#[serde(default)]
pub text: Option<String>,
#[serde(default)]
pub html_text: Option<String>,
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub status_type: Option<String>,
#[serde(default)]
pub custom_fields: Option<HashMap<String, serde_json::Value>>,
#[serde(default)]
pub opt_fields: Option<Vec<String>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum DeleteResourceType {
Task,
Project,
Portfolio,
Section,
Tag,
Comment,
#[serde(rename = "status_update")]
StatusUpdate,
#[serde(rename = "project_brief")]
ProjectBrief,
}
impl DeleteResourceType {
pub fn endpoint(&self) -> &'static str {
match self {
Self::Task => "tasks",
Self::Project => "projects",
Self::Portfolio => "portfolios",
Self::Section => "sections",
Self::Tag => "tags",
Self::Comment => "stories",
Self::StatusUpdate => "status_updates",
Self::ProjectBrief => "project_briefs",
}
}
pub fn display_name(&self) -> &'static str {
match self {
Self::Task => "task",
Self::Project => "project",
Self::Portfolio => "portfolio",
Self::Section => "section",
Self::Tag => "tag",
Self::Comment => "comment",
Self::StatusUpdate => "status update",
Self::ProjectBrief => "project brief",
}
}
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct DeleteParams {
pub resource_type: DeleteResourceType,
pub gid: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum LinkAction {
Add,
Remove,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RelationshipType {
#[serde(rename = "task_project")]
TaskProject,
#[serde(rename = "task_tag")]
TaskTag,
#[serde(rename = "task_parent")]
TaskParent,
#[serde(rename = "task_dependency")]
TaskDependency,
#[serde(rename = "task_dependent")]
TaskDependent,
#[serde(rename = "task_follower")]
TaskFollower,
#[serde(rename = "portfolio_item")]
PortfolioItem,
#[serde(rename = "portfolio_member")]
PortfolioMember,
#[serde(rename = "project_member")]
ProjectMember,
#[serde(rename = "project_follower")]
ProjectFollower,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct LinkParams {
pub action: LinkAction,
pub relationship: RelationshipType,
pub target_gid: String,
#[serde(default)]
pub item_gid: Option<String>,
#[serde(default)]
pub item_gids: Option<Vec<String>>,
#[serde(default)]
pub section_gid: Option<String>,
#[serde(default)]
pub insert_before: Option<String>,
#[serde(default)]
pub insert_after: Option<String>,
}