Skip to main content

lenso_contracts/
console.rs

1//! Lenso Console Module declarations.
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use utoipa::ToSchema;
6
7pub const CONSOLE_BRIDGE_PROTOCOL: &str = "lenso.console-bridge.v1";
8
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
10pub struct ConsoleSurface {
11    pub name: String,
12    pub label: String,
13    pub route: String,
14    pub presentation: ConsoleSurfacePresentation,
15    #[serde(default, skip_serializing_if = "Option::is_none")]
16    pub icon: Option<String>,
17    #[serde(default)]
18    pub required_capabilities: Vec<String>,
19    #[serde(default, skip_serializing_if = "Option::is_none")]
20    pub navigation: Option<ConsoleNavigation>,
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
24#[serde(tag = "kind", rename_all = "snake_case")]
25#[non_exhaustive]
26pub enum ConsoleSurfacePresentation {
27    Declarative {
28        schema: Value,
29    },
30    Isolated {
31        entry: String,
32        bridge_protocol: String,
33    },
34}
35
36#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
37pub struct ConsolePermissionRequest {
38    pub permission_id: String,
39    #[serde(default)]
40    pub operations: Vec<String>,
41    #[serde(default)]
42    pub resources: Vec<String>,
43    #[serde(default)]
44    pub outbound_destinations: Vec<String>,
45    #[serde(default)]
46    pub secret_references: Vec<String>,
47}
48
49#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
50pub struct ConsolePermissionGrant {
51    pub module_id: String,
52    pub module_release_digest: String,
53    #[serde(default, skip_serializing_if = "Option::is_none")]
54    pub ui_artifact_digest: Option<String>,
55    #[serde(default)]
56    pub granted_permissions: Vec<String>,
57}
58
59#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
60pub struct ConsoleContribution {
61    pub target: String,
62    pub target_version: u32,
63    pub label: String,
64    pub action: ConsoleContributionAction,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub icon: Option<String>,
67    #[serde(default)]
68    pub required_capabilities: Vec<String>,
69}
70
71#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
72pub struct ConsoleSlot {
73    pub id: String,
74    pub version: u32,
75    pub label: String,
76    #[serde(default)]
77    pub accepts: Vec<ConsoleContributionKind>,
78    #[serde(default)]
79    pub context: Vec<ConsoleSlotContext>,
80}
81
82#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
83#[serde(rename_all = "snake_case")]
84#[non_exhaustive]
85pub enum ConsoleContributionKind {
86    AdminAction,
87}
88
89#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
90pub struct ConsoleSlotContext {
91    pub name: String,
92    #[serde(default)]
93    pub fields: Vec<ConsoleSlotContextField>,
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
97pub struct ConsoleSlotContextField {
98    pub name: String,
99    pub field_type: ConsoleSlotContextFieldType,
100    #[serde(default)]
101    pub required: bool,
102}
103
104#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
105#[serde(rename_all = "snake_case")]
106#[non_exhaustive]
107pub enum ConsoleSlotContextFieldType {
108    String,
109    Boolean,
110    Number,
111    Timestamp,
112}
113
114#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
115#[serde(tag = "kind", rename_all = "snake_case")]
116#[non_exhaustive]
117pub enum ConsoleContributionAction {
118    AdminAction {
119        module: String,
120        name: String,
121        #[serde(default)]
122        input_bindings: Vec<ConsoleActionInputBinding>,
123    },
124}
125
126#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
127pub struct ConsoleActionInputBinding {
128    pub input: String,
129    pub value: ConsoleActionInputValue,
130}
131
132#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
133#[serde(tag = "kind", rename_all = "snake_case")]
134#[non_exhaustive]
135pub enum ConsoleActionInputValue {
136    SlotContext { path: String },
137}
138
139#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
140pub struct ConsoleNavigation {
141    pub workspace: ConsoleWorkspaceRef,
142    #[serde(default, skip_serializing_if = "Option::is_none")]
143    pub group: Option<ConsoleNavigationGroup>,
144    #[serde(default, skip_serializing_if = "Option::is_none")]
145    pub order: Option<i32>,
146}
147
148#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
149pub struct ConsoleWorkspaceRef {
150    pub id: String,
151    pub label: String,
152    #[serde(default, skip_serializing_if = "Option::is_none")]
153    pub icon: Option<String>,
154}
155
156#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, schemars::JsonSchema)]
157pub struct ConsoleNavigationGroup {
158    pub id: String,
159    pub label: String,
160    #[serde(default, skip_serializing_if = "Option::is_none")]
161    pub icon: Option<String>,
162    #[serde(default, skip_serializing_if = "Option::is_none")]
163    pub order: Option<i32>,
164}