1use crate::db::ExtensionId;
2use collections::BTreeSet;
3use rpc::ExtensionProvides;
4use sea_orm::entity::prelude::*;
5use time::PrimitiveDateTime;
6
7#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
8#[sea_orm(table_name = "extension_versions")]
9pub struct Model {
10 #[sea_orm(primary_key)]
11 pub extension_id: ExtensionId,
12 #[sea_orm(primary_key)]
13 pub version: String,
14 pub published_at: PrimitiveDateTime,
15 pub authors: String,
16 pub repository: String,
17 pub description: String,
18 pub schema_version: i32,
19 pub wasm_api_version: Option<String>,
20 pub download_count: i64,
21 pub provides_themes: bool,
22 pub provides_icon_themes: bool,
23 pub provides_languages: bool,
24 pub provides_grammars: bool,
25 pub provides_language_servers: bool,
26 pub provides_context_servers: bool,
27 pub provides_agent_servers: bool,
28 pub provides_slash_commands: bool,
29 pub provides_indexed_docs_providers: bool,
30 pub provides_snippets: bool,
31 pub provides_debug_adapters: bool,
32}
33
34impl Model {
35 pub fn provides(&self) -> BTreeSet<ExtensionProvides> {
36 let mut provides = BTreeSet::default();
37 if self.provides_themes {
38 provides.insert(ExtensionProvides::Themes);
39 }
40
41 if self.provides_icon_themes {
42 provides.insert(ExtensionProvides::IconThemes);
43 }
44
45 if self.provides_languages {
46 provides.insert(ExtensionProvides::Languages);
47 }
48
49 if self.provides_grammars {
50 provides.insert(ExtensionProvides::Grammars);
51 }
52
53 if self.provides_language_servers {
54 provides.insert(ExtensionProvides::LanguageServers);
55 }
56
57 if self.provides_context_servers {
58 provides.insert(ExtensionProvides::ContextServers);
59 }
60
61 if self.provides_agent_servers {
62 provides.insert(ExtensionProvides::AgentServers);
63 }
64
65 if self.provides_slash_commands {
66 provides.insert(ExtensionProvides::SlashCommands);
67 }
68
69 if self.provides_indexed_docs_providers {
70 provides.insert(ExtensionProvides::IndexedDocsProviders);
71 }
72
73 if self.provides_snippets {
74 provides.insert(ExtensionProvides::Snippets);
75 }
76
77 if self.provides_debug_adapters {
78 provides.insert(ExtensionProvides::DebugAdapters);
79 }
80
81 provides
82 }
83}
84
85#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
86pub enum Relation {
87 #[sea_orm(
88 belongs_to = "super::extension::Entity",
89 from = "Column::ExtensionId",
90 to = "super::extension::Column::Id"
91 on_condition = r#"super::extension::Column::LatestVersion.into_expr().eq(Column::Version.into_expr())"#
92 )]
93 Extension,
94}
95
96impl Related<super::extension::Entity> for Entity {
97 fn to() -> RelationDef {
98 Relation::Extension.def()
99 }
100}
101
102impl ActiveModelBehavior for ActiveModel {}