34 lines
1.2 KiB
Rust
34 lines
1.2 KiB
Rust
use crate::database::action::Action;
|
|
use indexmap::IndexMap;
|
|
use serde::{Deserialize, Serialize};
|
|
use serde_json::Value;
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
|
#[serde(default)]
|
|
pub struct Page {
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub path: Option<String>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub title: Option<String>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub sidebar: Option<Sidebar>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub actions: Option<IndexMap<String, Action>>,
|
|
/// The personal-scope filter template ("one surface, two scopes"): the
|
|
/// "mine" predicate the page merges into its filter when the app is in
|
|
/// personal scope, e.g. {"reserved_by": "$me"}. Opaque to the engine.
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub personal: Option<Value>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
|
#[serde(default)]
|
|
pub struct Sidebar {
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub category: Option<String>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub priority: Option<i32>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub icon: Option<String>,
|
|
}
|