use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WidgetSchema {
pub name: String,
pub description: String,
pub default_role: SemanticRole,
pub properties: Vec<PropertySchema>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub actions: Vec<super::AgentAction>,
pub usage_hint: Option<String>,
pub tags: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PropertySchema {
pub name: String,
pub description: String,
pub property_type: PropertyType,
pub required: bool,
pub default_value: Option<serde_json::Value>,
pub constraints: Vec<PropertyConstraint>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum PropertyType {
String,
Integer,
Float,
Boolean,
Color,
Style,
Rect,
Enum(Vec<String>),
Array(Box<PropertyType>),
Object(Vec<PropertySchema>),
Widget,
Any,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum PropertyConstraint {
Min(f64),
Max(f64),
MinLength(usize),
MaxLength(usize),
Pattern(String),
OneOf(Vec<serde_json::Value>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum SemanticRole {
Display,
Input,
Navigation,
Container,
Progress,
Selection,
DataVisualization,
Decoration,
Action,
Scrollable,
Modal,
Menu,
Toolbar,
StatusBar,
Custom(u16),
}
impl std::fmt::Display for SemanticRole {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Display => write!(f, "display"),
Self::Input => write!(f, "input"),
Self::Navigation => write!(f, "navigation"),
Self::Container => write!(f, "container"),
Self::Progress => write!(f, "progress"),
Self::Selection => write!(f, "selection"),
Self::DataVisualization => write!(f, "data-visualization"),
Self::Decoration => write!(f, "decoration"),
Self::Action => write!(f, "action"),
Self::Scrollable => write!(f, "scrollable"),
Self::Modal => write!(f, "modal"),
Self::Menu => write!(f, "menu"),
Self::Toolbar => write!(f, "toolbar"),
Self::StatusBar => write!(f, "status-bar"),
Self::Custom(id) => write!(f, "custom-{id}"),
}
}
}