1use yew::prelude::*;
6use yew_router::prelude::*;
7
8use crate::pages::{
9 analytics::AnalyticsPage,
10 dashboard::DashboardPage,
11 skills::SkillsPage,
12 skill_detail::SkillDetailPage,
13 run::RunPage,
14 history::HistoryPage,
15 settings::SettingsPage,
16 search_test::SearchTestPage,
17 onboarding::OnboardingPage,
18 not_found::NotFoundPage,
19};
20
21#[derive(Clone, Routable, PartialEq, Debug)]
23pub enum Route {
24 #[at("/")]
26 Dashboard,
27
28 #[at("/skills")]
30 Skills,
31
32 #[at("/skills/:name")]
34 SkillDetail { name: String },
35
36 #[at("/skills/:name/instances/:instance")]
38 SkillInstance { name: String, instance: String },
39
40 #[at("/run")]
42 Run,
43
44 #[at("/run/:skill")]
46 RunSkill { skill: String },
47
48 #[at("/run/:skill/:tool")]
50 RunSkillTool { skill: String, tool: String },
51
52 #[at("/history")]
54 History,
55
56 #[at("/history/:id")]
58 HistoryDetail { id: String },
59
60 #[at("/settings")]
62 Settings,
63
64 #[at("/search-test")]
66 SearchTest,
67
68 #[at("/analytics")]
70 Analytics,
71
72 #[at("/onboarding")]
74 Onboarding,
75
76 #[at("/onboarding/:step")]
78 OnboardingStep { step: String },
79
80 #[not_found]
82 #[at("/404")]
83 NotFound,
84}
85
86pub fn switch(route: Route) -> Html {
88 match route {
89 Route::Dashboard => html! { <DashboardPage /> },
90 Route::Skills => html! { <SkillsPage /> },
91 Route::SkillDetail { name } => html! { <SkillDetailPage {name} /> },
92 Route::SkillInstance { name, instance } => html! {
93 <SkillDetailPage {name} selected_instance={Some(instance)} />
94 },
95 Route::Run => html! { <RunPage /> },
96 Route::RunSkill { skill } => html! { <RunPage selected_skill={Some(skill)} /> },
97 Route::RunSkillTool { skill, tool } => html! {
98 <RunPage selected_skill={Some(skill)} selected_tool={Some(tool)} />
99 },
100 Route::History => html! { <HistoryPage /> },
101 Route::HistoryDetail { id } => html! { <HistoryPage selected_id={Some(id)} /> },
102 Route::Settings => html! { <SettingsPage /> },
103 Route::SearchTest => html! { <SearchTestPage /> },
104 Route::Analytics => html! { <AnalyticsPage /> },
105 Route::Onboarding => html! { <OnboardingPage /> },
106 Route::OnboardingStep { step } => html! { <OnboardingPage {step} /> },
107 Route::NotFound => html! { <NotFoundPage /> },
108 }
109}
110
111impl Route {
113 pub fn display_name(&self) -> &'static str {
114 match self {
115 Route::Dashboard => "Dashboard",
116 Route::Skills => "Skills",
117 Route::SkillDetail { .. } => "Skill Details",
118 Route::SkillInstance { .. } => "Instance Configuration",
119 Route::Run | Route::RunSkill { .. } | Route::RunSkillTool { .. } => "Run",
120 Route::History | Route::HistoryDetail { .. } => "History",
121 Route::Settings => "Settings",
122 Route::SearchTest => "Search Test",
123 Route::Analytics => "Analytics",
124 Route::Onboarding | Route::OnboardingStep { .. } => "Setup",
125 Route::NotFound => "Not Found",
126 }
127 }
128
129 pub fn show_sidebar(&self) -> bool {
131 !matches!(self, Route::Onboarding | Route::OnboardingStep { .. })
132 }
133}