Skip to main content

gproxy_channel_api/
metadata.rs

1//! Self-description used by the Admin API and generic Console forms.
2
3use 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}