gproxy_channel_api/
metadata.rs1use serde::{Deserialize, Serialize};
4use serde_json::{Value, json};
5
6use crate::protocol::Provider;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(rename_all = "snake_case")]
10pub enum CredentialFamily {
11 ApiKey,
12 OauthTokens,
13 ServiceAccount,
14 GithubToken,
15}
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
18#[serde(rename_all = "snake_case")]
19pub enum LoginMode {
20 Authcode,
21 Device,
22 Cookie,
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
26#[serde(rename_all = "snake_case")]
27pub enum SettingControl {
28 Text,
29 Url,
30 Boolean,
31 Integer,
32 StringList,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
36pub struct ChannelSettingField {
37 pub key: String,
38 pub control: SettingControl,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
40 pub label: Option<String>,
41 #[serde(default)]
42 pub required: bool,
43 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub default: Option<Value>,
45 #[serde(default, skip_serializing_if = "Option::is_none")]
46 pub placeholder: Option<String>,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct ChannelMetadata {
51 pub id: String,
52 pub display_name: String,
53 pub provider_family: Provider,
54 pub credential_family: CredentialFamily,
55 pub login_modes: Vec<LoginMode>,
56 pub settings_fields: Vec<ChannelSettingField>,
57 pub secret_template: Value,
58 pub endpoint_kinds: Vec<String>,
59 pub usage: bool,
60}
61
62impl ChannelMetadata {
63 pub fn new(id: impl Into<String>, provider_family: Provider) -> Self {
64 let id = id.into();
65 Self {
66 display_name: id.clone(),
67 id,
68 provider_family,
69 credential_family: CredentialFamily::ApiKey,
70 login_modes: Vec::new(),
71 settings_fields: Vec::new(),
72 secret_template: json!({ "api_key": "" }),
73 endpoint_kinds: Vec::new(),
74 usage: false,
75 }
76 }
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
80#[serde(rename_all = "snake_case")]
81pub enum ChannelSource {
82 Builtin,
83 External,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct ChannelCatalogEntry {
88 pub source: ChannelSource,
89 #[serde(flatten)]
90 pub metadata: ChannelMetadata,
91}