use serde::{Deserialize, Deserializer, Serialize, Serializer}; use sqlx::encode::IsNull; use sqlx::error::BoxDynError; use sqlx::postgres::{PgArgumentBuffer, PgHasArrayType, PgTypeInfo, PgValueRef}; use sqlx::{Decode, Encode, Postgres, Type}; use std::fmt; use std::str::FromStr; pub type JsonValue = serde_json::Value; macro_rules! string_enum { ( $(#[$meta:meta])* pub enum $name:ident { $( $variant:ident => $value:literal ),+ $(,)? } ) => { $(#[$meta])* #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, utoipa::ToSchema)] pub enum $name { $( $variant, )+ } impl $name { pub const fn as_str(self) -> &'static str { match self { $( Self::$variant => $value, )+ } } } impl fmt::Display for $name { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(self.as_str()) } } impl FromStr for $name { type Err = (); fn from_str(value: &str) -> Result { Ok(match value { $( $value => Self::$variant, )+ _ => Self::Unknown, }) } } impl Serialize for $name { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(self.as_str()) } } impl<'de> Deserialize<'de> for $name { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { let value = String::deserialize(deserializer)?; Ok(value.parse().unwrap_or(Self::Unknown)) } } impl Type for $name { fn type_info() -> PgTypeInfo { >::type_info() } fn compatible(ty: &PgTypeInfo) -> bool { >::compatible(ty) } } impl<'r> Decode<'r, Postgres> for $name { fn decode(value: PgValueRef<'r>) -> Result { let value = >::decode(value)?; Ok(value.parse().unwrap_or(Self::Unknown)) } } impl<'q> Encode<'q, Postgres> for $name { fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> Result { <&str as Encode>::encode_by_ref(&self.as_str(), buf) } fn size_hint(&self) -> usize { <&str as Encode>::size_hint(&self.as_str()) } } impl PgHasArrayType for $name { fn array_type_info() -> PgTypeInfo { ::array_type_info() } fn array_compatible(ty: &PgTypeInfo) -> bool { ::array_compatible(ty) } } }; } string_enum! { /// Cross-domain lifecycle/status values persisted as snake_case text. pub enum Status { Active => "active", Inactive => "inactive", Enabled => "enabled", Disabled => "disabled", Pending => "pending", Queued => "queued", Running => "running", Processing => "processing", Completed => "completed", Success => "success", Failed => "failed", Error => "error", Canceled => "canceled", Cancelled => "cancelled", Draft => "draft", Open => "open", Closed => "closed", Merged => "merged", Archived => "archived", Deleted => "deleted", Revoked => "revoked", Expired => "expired", Accepted => "accepted", Rejected => "rejected", Approved => "approved", Healthy => "healthy", Degraded => "degraded", Unhealthy => "unhealthy", Online => "online", Offline => "offline", Added => "added", Modified => "modified", Removed => "removed", Renamed => "renamed", Copied => "copied", Unknown => "unknown", } } string_enum! { pub enum State { Open => "open", Closed => "closed", Merged => "merged", Draft => "draft", Pending => "pending", Queued => "queued", Running => "running", Success => "success", Failure => "failure", Failed => "failed", Error => "error", Skipped => "skipped", Blocked => "blocked", Clean => "clean", Dirty => "dirty", Unknown => "unknown", } } string_enum! { pub enum Role { Owner => "owner", Admin => "admin", Maintainer => "maintainer", Member => "member", Guest => "guest", Viewer => "viewer", Editor => "editor", Contributor => "contributor", Moderator => "moderator", User => "user", Bot => "bot", Agent => "agent", Assistant => "assistant", System => "system", Author => "author", Reviewer => "reviewer", Assignee => "assignee", Unknown => "unknown", } } string_enum! { pub enum Visibility { Public => "public", Private => "private", Internal => "internal", Workspace => "workspace", Protected => "protected", Hidden => "hidden", Secret => "secret", Unknown => "unknown", } } impl Default for Visibility { fn default() -> Self { Visibility::Unknown } } string_enum! { pub enum Priority { None => "none", Low => "low", Medium => "medium", High => "high", Critical => "critical", Urgent => "urgent", Unknown => "unknown", } } string_enum! { pub enum MessageRole { System => "system", User => "user", Assistant => "assistant", Agent => "agent", Tool => "tool", Developer => "developer", Unknown => "unknown", } } string_enum! { pub enum MessageType { Text => "text", Markdown => "markdown", Html => "html", System => "system", Event => "event", File => "file", Image => "image", Code => "code", ToolCall => "tool_call", ToolResult => "tool_result", Audio => "audio", Video => "video", Unknown => "unknown", } } string_enum! { pub enum ContentFormat { PlainText => "plain_text", Markdown => "markdown", Html => "html", Json => "json", Unknown => "unknown", } } string_enum! { pub enum EventType { Created => "created", Updated => "updated", Deleted => "deleted", Closed => "closed", Reopened => "reopened", Assigned => "assigned", Unassigned => "unassigned", Labeled => "labeled", Unlabeled => "unlabeled", Commented => "commented", Mentioned => "mentioned", Pushed => "pushed", Merged => "merged", Reviewed => "reviewed", Archived => "archived", Restored => "restored", Joined => "joined", Left => "left", Invited => "invited", Accepted => "accepted", Revoked => "revoked", DraftReady => "draft_ready", Unknown => "unknown", } } string_enum! { pub enum TargetType { User => "user", Workspace => "workspace", Repo => "repo", Issue => "issue", PullRequest => "pull_request", Channel => "channel", Message => "message", Conversation => "conversation", Agent => "agent", AiModel => "ai_model", Commit => "commit", Branch => "branch", Release => "release", Unknown => "unknown", } } string_enum! { pub enum NotificationType { Mention => "mention", Assignment => "assignment", Review => "review", Comment => "comment", Build => "build", Security => "security", Billing => "billing", System => "system", Digest => "digest", Unknown => "unknown", } } string_enum! { pub enum DeliveryChannel { Email => "email", Web => "web", Push => "push", Slack => "slack", Discord => "discord", Webhook => "webhook", Sms => "sms", Unknown => "unknown", } } string_enum! { pub enum SubscriptionLevel { All => "all", Participating => "participating", Mention => "mention", Watch => "watch", Ignore => "ignore", None => "none", Custom => "custom", Unknown => "unknown", } } string_enum! { pub enum Provider { Github => "github", Gitlab => "gitlab", Google => "google", Slack => "slack", Discord => "discord", Email => "email", Web => "web", Push => "push", Openai => "openai", Anthropic => "anthropic", Gemini => "gemini", Ollama => "ollama", Azure => "azure", Aws => "aws", Stripe => "stripe", Unknown => "unknown", } } string_enum! { pub enum AgentType { Assistant => "assistant", Automation => "automation", Reviewer => "reviewer", Triage => "triage", Scheduler => "scheduler", Bot => "bot", Unknown => "unknown", } } string_enum! { pub enum AiModelType { Chat => "chat", Completion => "completion", Embedding => "embedding", Reranker => "reranker", Image => "image", Audio => "audio", Multimodal => "multimodal", Moderation => "moderation", Unknown => "unknown", } } string_enum! { pub enum ConversationType { Chat => "chat", Issue => "issue", PullRequest => "pull_request", Review => "review", Agent => "agent", Support => "support", Incident => "incident", Unknown => "unknown", } } string_enum! { pub enum StepType { Model => "model", Tool => "tool", Reasoning => "reasoning", Retrieval => "retrieval", Planning => "planning", Execution => "execution", Validation => "validation", Unknown => "unknown", } } string_enum! { pub enum TriggerType { Manual => "manual", Schedule => "schedule", Webhook => "webhook", Event => "event", Issue => "issue", PullRequest => "pull_request", Push => "push", Message => "message", Unknown => "unknown", } } string_enum! { pub enum RelationType { Closes => "closes", Fixes => "fixes", References => "references", Blocks => "blocks", Duplicates => "duplicates", Related => "related", Implements => "implements", Mentions => "mentions", Resolves => "resolves", Unknown => "unknown", } } string_enum! { pub enum RequestType { Join => "join", Invite => "invite", Access => "access", Approval => "approval", Billing => "billing", Delete => "delete", Transfer => "transfer", Unknown => "unknown", } } string_enum! { pub enum DeviceType { Desktop => "desktop", Laptop => "laptop", Mobile => "mobile", Tablet => "tablet", Browser => "browser", Cli => "cli", Api => "api", Unknown => "unknown", } } string_enum! { pub enum KeyType { Rsa => "rsa", Ed25519 => "ed25519", Ecdsa => "ecdsa", Dsa => "dsa", Unknown => "unknown", } } string_enum! { pub enum PasswordAlgorithm { Argon2id => "argon2id", Bcrypt => "bcrypt", Scrypt => "scrypt", Pbkdf2 => "pbkdf2", Unknown => "unknown", } } string_enum! { pub enum DigestFrequency { Never => "never", Daily => "daily", Weekly => "weekly", Monthly => "monthly", Realtime => "realtime", Unknown => "unknown", } } string_enum! { pub enum GitService { Local => "local", Gitea => "gitea", Gitlab => "gitlab", Github => "github", Unknown => "unknown", } } string_enum! { pub enum FeedbackType { Bug => "bug", Quality => "quality", Safety => "safety", Performance => "performance", Suggestion => "suggestion", Other => "other", Unknown => "unknown", } } string_enum! { pub enum ParticipantType { User => "user", Agent => "agent", Bot => "bot", System => "system", Unknown => "unknown", } } string_enum! { pub enum SummaryType { Short => "short", Detailed => "detailed", Rolling => "rolling", Final => "final", ActionItems => "action_items", Unknown => "unknown", } } string_enum! { pub enum LinkType { Primary => "primary", Mirror => "mirror", Notification => "notification", Automation => "automation", Related => "related", Unknown => "unknown", } } string_enum! { pub enum ChannelType { Public => "public", Private => "private", Direct => "direct", Group => "group", Repo => "repo", System => "system", Unknown => "unknown", } } string_enum! { pub enum MergeStrategyKind { Merge => "merge", Squash => "squash", Rebase => "rebase", FastForward => "fast_forward", Unknown => "unknown", } } string_enum! { pub enum PricingUnit { Token => "token", OneKTokens => "1k_tokens", OneMTokens => "1m_tokens", Request => "request", Image => "image", Minute => "minute", Unknown => "unknown", } } string_enum! { pub enum Theme { System => "system", Light => "light", Dark => "dark", Unknown => "unknown", } } string_enum! { pub enum ColorScheme { System => "system", Light => "light", Dark => "dark", HighContrast => "high_contrast", Unknown => "unknown", } } string_enum! { pub enum Density { Compact => "compact", Comfortable => "comfortable", Spacious => "spacious", Unknown => "unknown", } } string_enum! { pub enum FontSize { Small => "small", Medium => "medium", Large => "large", ExtraLarge => "extra_large", Unknown => "unknown", } } string_enum! { pub enum Scope { Read => "read", Write => "write", Admin => "admin", RepoRead => "repo:read", RepoWrite => "repo:write", IssueRead => "issue:read", IssueWrite => "issue:write", PullRequestRead => "pull_request:read", PullRequestWrite => "pull_request:write", WorkspaceRead => "workspace:read", WorkspaceWrite => "workspace:write", UserRead => "user:read", UserWrite => "user:write", Unknown => "unknown", } } string_enum! { pub enum Permission { Read => "read", Write => "write", Admin => "admin", Execute => "execute", ManageMembers => "manage_members", ManageSettings => "manage_settings", ManageWebhooks => "manage_webhooks", ManageBilling => "manage_billing", Unknown => "unknown", } } string_enum! { pub enum Modality { Text => "text", Image => "image", Audio => "audio", Video => "video", File => "file", Unknown => "unknown", } } string_enum! { pub enum AiFeature { Streaming => "streaming", ToolCalling => "tool_calling", JsonMode => "json_mode", Vision => "vision", Audio => "audio", Reasoning => "reasoning", Caching => "caching", Unknown => "unknown", } } string_enum! { pub enum PresenceStatus { Online => "online", Idle => "idle", Dnd => "dnd", Invisible => "invisible", Offline => "offline", Away => "away", Unknown => "unknown", } } string_enum! { pub enum ActivityType { Playing => "playing", Listening => "listening", Watching => "watching", Streaming => "streaming", Competing => "competing", Custom => "custom", Unknown => "unknown", } } string_enum! { pub enum SyncDirection { Inbound => "inbound", Outbound => "outbound", Bidirectional => "bidirectional", Unknown => "unknown", } } string_enum! { pub enum OverwriteTarget { User => "user", Role => "role", Unknown => "unknown", } } string_enum! { pub enum EmbedType { Link => "link", Article => "article", Image => "image", Video => "video", Rich => "rich", Unknown => "unknown", } } string_enum! { pub enum ChannelKind { Text => "text", Voice => "voice", Stage => "stage", Forum => "forum", Announcement => "announcement", Unknown => "unknown", } } string_enum! { pub enum ForumSortOrder { LatestActivity => "latest_activity", CreationDate => "creation_date", Unknown => "unknown", } } string_enum! { pub enum ForumLayout { Default => "default", ListView => "list_view", GalleryView => "gallery_view", Unknown => "unknown", } } string_enum! { pub enum StagePrivacyLevel { Public => "public", GuildOnly => "guild_only", Unknown => "unknown", } } string_enum! { pub enum PollLayout { Default => "default", SingleChoice => "single_choice", MultipleChoice => "multiple_choice", Unknown => "unknown", } } string_enum! { pub enum ArticleStatus { Draft => "draft", Scheduled => "scheduled", Published => "published", Archived => "archived", Unpublished => "unpublished", Unknown => "unknown", } } string_enum! { /// Pull request review states. pub enum ReviewState { Pending => "pending", Approved => "approved", ChangesRequested => "changes_requested", Commented => "commented", Dismissed => "dismissed", Unknown => "unknown", } } /// Default git revision reference. pub const DEFAULT_REVISION: &str = "HEAD";