Files
appks/models/common.rs
T
2026-06-07 11:30:56 +08:00

795 lines
18 KiB
Rust

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<Self, Self::Err> {
Ok(match value {
$( $value => Self::$variant, )+
_ => Self::Unknown,
})
}
}
impl Serialize for $name {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for $name {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
Ok(value.parse().unwrap_or(Self::Unknown))
}
}
impl Type<Postgres> for $name {
fn type_info() -> PgTypeInfo {
<String as Type<Postgres>>::type_info()
}
fn compatible(ty: &PgTypeInfo) -> bool {
<String as Type<Postgres>>::compatible(ty)
}
}
impl<'r> Decode<'r, Postgres> for $name {
fn decode(value: PgValueRef<'r>) -> Result<Self, BoxDynError> {
let value = <String as Decode<Postgres>>::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<IsNull, BoxDynError> {
<&str as Encode<Postgres>>::encode_by_ref(&self.as_str(), buf)
}
fn size_hint(&self) -> usize {
<&str as Encode<Postgres>>::size_hint(&self.as_str())
}
}
impl PgHasArrayType for $name {
fn array_type_info() -> PgTypeInfo {
<String as PgHasArrayType>::array_type_info()
}
fn array_compatible(ty: &PgTypeInfo) -> bool {
<String as PgHasArrayType>::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",
}
}
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",
}
}