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_slash_commands: bool,
28 pub provides_indexed_docs_providers: bool,
29 pub provides_snippets: bool,
30 pub provides_debug_adapters: bool,
31}
32
33impl Model {
34 pub fn provides(&self) -> BTreeSet<ExtensionProvides> {
35 let mut provides = BTreeSet::default();
36 if self.provides_themes {
37 provides.insert(ExtensionProvides::Themes);
38 }
39
40 if self.provides_icon_themes {
41 provides.insert(ExtensionProvides::IconThemes);
42 }
43
44 if self.provides_languages {
45 provides.insert(ExtensionProvides::Languages);
46 }
47
48 if self.provides_grammars {
49 provides.insert(ExtensionProvides::Grammars);
50 }
51
52 if self.provides_language_servers {
53 provides.insert(ExtensionProvides::LanguageServers);
54 }
55
56 if self.provides_context_servers {
57 provides.insert(ExtensionProvides::ContextServers);
58 }
59
60 if self.provides_slash_commands {
61 provides.insert(ExtensionProvides::SlashCommands);
62 }
63
64 if self.provides_indexed_docs_providers {
65 provides.insert(ExtensionProvides::IndexedDocsProviders);
66 }
67
68 if self.provides_snippets {
69 provides.insert(ExtensionProvides::Snippets);
70 }
71
72 if self.provides_debug_adapters {
73 provides.insert(ExtensionProvides::DebugAdapters);
74 }
75
76 provides
77 }
78}
79
80#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
81pub enum Relation {
82 #[sea_orm(
83 belongs_to = "super::extension::Entity",
84 from = "Column::ExtensionId",
85 to = "super::extension::Column::Id"
86 on_condition = r#"super::extension::Column::LatestVersion.into_expr().eq(Column::Version.into_expr())"#
87 )]
88 Extension,
89}
90
91impl Related<super::extension::Entity> for Entity {
92 fn to() -> RelationDef {
93 Relation::Extension.def()
94 }
95}
96
97impl ActiveModelBehavior for ActiveModel {}