use rust_widgets::widget::capability::{factory_name_for_kind, WidgetFactory};
use rust_widgets::widget::WidgetKind;
fn all_kinds() -> Vec<WidgetKind> {
use WidgetKind::*;
let kinds = vec![
Window,
Dialog,
MessageBox,
FileDialog,
ColorDialog,
FontDialog,
InputDialog,
ProgressDialog,
PopupWindow,
Button,
CheckBox,
RadioButton,
Label,
LineEdit,
TextEdit,
RichEdit,
ComboBox,
SpinBox,
ListBox,
ListView,
TreeView,
ProgressBar,
Slider,
ScrollBar,
ScrollArea,
Panel,
Frame,
DockPanel,
GroupBox,
TabWidget,
Splitter,
MdiArea,
MenuBar,
Menu,
MenuItem,
ContextMenu,
ToolBar,
StatusBar,
Canvas,
Table,
Grid,
Chart,
RadarChart,
KanbanBoard,
Cascader,
QueryBuilder,
EmojiPicker,
Mention,
ToggleButton,
CheckListBox,
DoubleSpinBox,
Dial,
Wizard,
DatePicker,
TimePicker,
DateTimePicker,
DirectoryDialog,
DataView,
PropertyGrid,
Toolbox,
StackedWidget,
CollapsiblePane,
DockWidget,
ActivityIndicator,
Calendar,
ColumnView,
UndoView,
CommandLink,
LCDNumber,
FontComboBox,
WebEngineView,
Action,
ToolButton,
FreeformShape,
TabBar,
PieMenu,
RibbonBar,
Line,
Meter,
MiniChart,
ImageView,
MiniCanvas,
Arc,
Spinner,
Roller,
Dropdown,
TextArea,
Keyboard,
Switch,
SearchBox,
Chip,
Badge,
SkeletonLoader,
FAB,
BottomSheet,
BottomNavigationBar,
NavigationDrawer,
AppBar,
MobileDatePicker,
Divider,
Stepper,
Rating,
Avatar,
EmptyState,
Carousel,
ColorHistory,
ColorWell,
TagInput,
ImePreedit,
InplaceEditor,
QRCode,
MasonryLayout,
CupertinoSwitch,
MaterialSnackbar,
AdaptiveScaffold,
WizardDialog,
SafeArea,
CupertinoAlertDialog,
CupertinoSlider,
MaterialNavigationRail,
Tooltip,
SegmentedButton,
NavigationStack,
ProgressCircle,
Icon,
DropdownMenu,
MaskedEdit,
MenuButton,
Popover,
AutoCompleteEdit,
MultiSelectComboBox,
RangeSlider,
FloatingLabel,
FontPreview,
CupertinoNavigationBar,
CupertinoSegmentedControl,
SwipeToDismiss,
TabView,
SearchBar,
ShortcutEditor,
RefreshControl,
ModalBottomSheet,
LineChart,
Sparkline,
BarChart,
FindReplaceDialog,
PropertiesPanel,
PieChart,
CupertinoDatePicker,
EditableComboBox,
DateRangePicker,
AnimatedImage,
HeroAnimation,
BezierCurveEditor,
LottieWidget,
RiveWidget,
VideoPlayer,
ImageGallery,
AudioVisualizer,
CameraPreview,
BarcodeScanner,
GridTable,
NumberPicker,
OtpInput,
Banner,
Pagination,
ColorPicker,
Toast,
SplashScreen,
CandlestickChart,
VolumeChart,
DepthChart,
OrderBook,
QuoteBoard,
IndicatorChart,
];
kinds
}
fn exhaustive(kind: WidgetKind) -> &'static str {
use WidgetKind::*;
match kind {
Window => "Window",
Dialog => "Dialog",
MessageBox => "MessageBox",
FileDialog => "FileDialog",
ColorDialog => "ColorDialog",
FontDialog => "FontDialog",
InputDialog => "InputDialog",
ProgressDialog => "ProgressDialog",
PopupWindow => "PopupWindow",
Button => "Button",
CheckBox => "CheckBox",
RadioButton => "RadioButton",
Label => "Label",
LineEdit => "LineEdit",
TextEdit => "TextEdit",
RichEdit => "RichEdit",
ComboBox => "ComboBox",
SpinBox => "SpinBox",
ListBox => "ListBox",
ListView => "ListView",
TreeView => "TreeView",
ProgressBar => "ProgressBar",
Slider => "Slider",
ScrollBar => "ScrollBar",
ScrollArea => "ScrollArea",
Panel => "Panel",
Frame => "Frame",
DockPanel => "DockPanel",
GroupBox => "GroupBox",
TabWidget => "TabWidget",
Splitter => "Splitter",
MdiArea => "MdiArea",
MenuBar => "MenuBar",
Menu => "Menu",
MenuItem => "MenuItem",
ContextMenu => "ContextMenu",
ToolBar => "ToolBar",
StatusBar => "StatusBar",
Canvas => "Canvas",
Table => "Table",
Grid => "Grid",
Chart => "Chart",
RadarChart => "RadarChart",
KanbanBoard => "KanbanBoard",
Cascader => "Cascader",
QueryBuilder => "QueryBuilder",
EmojiPicker => "EmojiPicker",
Mention => "Mention",
ToggleButton => "ToggleButton",
CheckListBox => "CheckListBox",
DoubleSpinBox => "DoubleSpinBox",
Dial => "Dial",
Wizard => "Wizard",
DatePicker => "DatePicker",
TimePicker => "TimePicker",
DateTimePicker => "DateTimePicker",
DirectoryDialog => "DirectoryDialog",
DataView => "DataView",
PropertyGrid => "PropertyGrid",
Toolbox => "Toolbox",
StackedWidget => "StackedWidget",
CollapsiblePane => "CollapsiblePane",
DockWidget => "DockWidget",
ActivityIndicator => "ActivityIndicator",
Calendar => "Calendar",
ColumnView => "ColumnView",
UndoView => "UndoView",
CommandLink => "CommandLink",
LCDNumber => "LCDNumber",
FontComboBox => "FontComboBox",
WebEngineView => "WebEngineView",
Action => "Action",
ToolButton => "ToolButton",
FreeformShape => "FreeformShape",
TabBar => "TabBar",
PieMenu => "PieMenu",
RibbonBar => "RibbonBar",
Line => "Line",
Meter => "Meter",
MiniChart => "MiniChart",
ImageView => "ImageView",
MiniCanvas => "MiniCanvas",
Arc => "Arc",
Spinner => "Spinner",
Roller => "Roller",
Dropdown => "Dropdown",
TextArea => "TextArea",
Keyboard => "Keyboard",
Switch => "Switch",
SearchBox => "SearchBox",
Chip => "Chip",
Badge => "Badge",
SkeletonLoader => "SkeletonLoader",
FAB => "FAB",
BottomSheet => "BottomSheet",
BottomNavigationBar => "BottomNavigationBar",
NavigationDrawer => "NavigationDrawer",
AppBar => "AppBar",
MobileDatePicker => "MobileDatePicker",
Divider => "Divider",
Stepper => "Stepper",
Rating => "Rating",
Avatar => "Avatar",
EmptyState => "EmptyState",
Carousel => "Carousel",
ColorHistory => "ColorHistory",
ColorWell => "ColorWell",
TagInput => "TagInput",
ImePreedit => "ImePreedit",
InplaceEditor => "InplaceEditor",
QRCode => "QRCode",
MasonryLayout => "MasonryLayout",
CupertinoSwitch => "CupertinoSwitch",
MaterialSnackbar => "MaterialSnackbar",
AdaptiveScaffold => "AdaptiveScaffold",
WizardDialog => "WizardDialog",
SafeArea => "SafeArea",
CupertinoAlertDialog => "CupertinoAlertDialog",
CupertinoSlider => "CupertinoSlider",
MaterialNavigationRail => "MaterialNavigationRail",
Tooltip => "Tooltip",
SegmentedButton => "SegmentedButton",
NavigationStack => "NavigationStack",
ProgressCircle => "ProgressCircle",
Icon => "Icon",
DropdownMenu => "DropdownMenu",
MaskedEdit => "MaskedEdit",
MenuButton => "MenuButton",
Popover => "Popover",
AutoCompleteEdit => "AutoCompleteEdit",
MultiSelectComboBox => "MultiSelectComboBox",
RangeSlider => "RangeSlider",
FloatingLabel => "FloatingLabel",
FontPreview => "FontPreview",
CupertinoNavigationBar => "CupertinoNavigationBar",
CupertinoSegmentedControl => "CupertinoSegmentedControl",
SwipeToDismiss => "SwipeToDismiss",
TabView => "TabView",
SearchBar => "SearchBar",
ShortcutEditor => "ShortcutEditor",
RefreshControl => "RefreshControl",
ModalBottomSheet => "ModalBottomSheet",
LineChart => "LineChart",
Sparkline => "Sparkline",
BarChart => "BarChart",
FindReplaceDialog => "FindReplaceDialog",
PropertiesPanel => "PropertiesPanel",
PieChart => "PieChart",
CupertinoDatePicker => "CupertinoDatePicker",
EditableComboBox => "EditableComboBox",
DateRangePicker => "DateRangePicker",
AnimatedImage => "AnimatedImage",
HeroAnimation => "HeroAnimation",
BezierCurveEditor => "BezierCurveEditor",
LottieWidget => "LottieWidget",
RiveWidget => "RiveWidget",
VideoPlayer => "VideoPlayer",
ImageGallery => "ImageGallery",
AudioVisualizer => "AudioVisualizer",
CameraPreview => "CameraPreview",
BarcodeScanner => "BarcodeScanner",
GridTable => "GridTable",
NumberPicker => "NumberPicker",
OtpInput => "OtpInput",
Banner => "Banner",
Pagination => "Pagination",
ColorPicker => "ColorPicker",
Toast => "Toast",
SplashScreen => "SplashScreen",
CandlestickChart => "CandlestickChart",
VolumeChart => "VolumeChart",
DepthChart => "DepthChart",
OrderBook => "OrderBook",
QuoteBoard => "QuoteBoard",
IndicatorChart => "IndicatorChart",
}
}
fn kind_name(kind: WidgetKind) -> String {
exhaustive(kind).to_string()
}
fn main() {
let factory = WidgetFactory::new_with_defaults();
if std::env::args().any(|argument| argument == "--shared-kind-resolution") {
let resolutions: Vec<serde_json::Value> = all_kinds()
.into_iter()
.map(|kind| {
let resolved = factory
.capability_by_kind(kind)
.map(|capability| capability.canonical_name)
.unwrap_or("");
let candidates = factory.capabilities_for_kind(kind).count();
serde_json::json!({
"kind": kind_name(kind),
"resolved": resolved,
"candidates": candidates,
})
})
.collect();
println!("{}", serde_json::json!({ "resolutions": resolutions }));
return;
}
let kinds: Vec<String> = all_kinds().into_iter().map(kind_name).collect();
let registered: Vec<String> = factory.widget_names().into_iter().map(str::to_string).collect();
let mut aliases: Vec<String> = Vec::new();
for capability in factory.capabilities() {
aliases.push(capability.canonical_name.to_string());
for alias in capability.aliases {
aliases.push((*alias).to_string());
}
}
aliases.sort_unstable();
aliases.dedup();
let unconstructible: Vec<String> = all_kinds()
.into_iter()
.filter(|kind| factory_name_for_kind(*kind).is_empty())
.map(kind_name)
.collect();
println!(
"{}",
serde_json::json!({
"kinds": kinds,
"registered": aliases,
"canonical": registered,
"unconstructible": unconstructible,
})
);
}
#[cfg(test)]
mod tests {
#[test]
fn kind_list_is_exhaustive() {
assert_eq!(super::all_kinds().len(), 175);
}
#[test]
fn vec_and_match_agree() {
for kind in super::all_kinds() {
let named = super::exhaustive(kind);
assert_eq!(named, format!("{kind:?}"), "name mismatch for {kind:?}");
}
}
}