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