795 lines
18 KiB
Rust
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",
|
|
}
|
|
}
|