use serde::{Deserialize, Serialize};
pub type ComponentId = String;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DataBinding {
pub path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct FunctionCall {
pub call: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub args: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub return_type: Option<ReturnType>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ReturnType {
String,
Number,
Boolean,
Array,
Object,
Any,
Void,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum DynamicValue {
String(String),
Number(f64),
Boolean(bool),
Array(Vec<serde_json::Value>),
Binding(DataBinding),
Function(FunctionCall),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum DynamicString {
Literal(String),
Binding(DataBinding),
Function(FunctionCall),
}
impl From<&str> for DynamicString {
fn from(s: &str) -> Self {
DynamicString::Literal(s.to_string())
}
}
impl From<String> for DynamicString {
fn from(s: String) -> Self {
DynamicString::Literal(s)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum DynamicNumber {
Literal(f64),
Binding(DataBinding),
Function(FunctionCall),
}
impl From<f64> for DynamicNumber {
fn from(n: f64) -> Self {
DynamicNumber::Literal(n)
}
}
impl From<i32> for DynamicNumber {
fn from(n: i32) -> Self {
DynamicNumber::Literal(n as f64)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum DynamicBoolean {
Literal(bool),
Binding(DataBinding),
Function(FunctionCall),
}
impl From<bool> for DynamicBoolean {
fn from(b: bool) -> Self {
DynamicBoolean::Literal(b)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum DynamicStringList {
Literal(Vec<String>),
Binding(DataBinding),
Function(FunctionCall),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum ChildList {
Static(Vec<ComponentId>),
Template(ChildTemplate),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct ChildTemplate {
pub component_id: ComponentId,
pub path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CheckRule {
pub condition: DynamicBoolean,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct Checkable {
#[serde(skip_serializing_if = "Option::is_none")]
pub checks: Option<Vec<CheckRule>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct AccessibilityAttributes {
#[serde(skip_serializing_if = "Option::is_none")]
pub label: Option<DynamicString>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<DynamicString>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum Action {
Event(EventAction),
Function(FunctionAction),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct EventAction {
pub event: EventDefinition,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct EventDefinition {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub context: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct FunctionAction {
pub function_call: FunctionCall,
}