1mod detect;
13mod navigate;
14
15pub use detect::detect_router;
16pub use navigate::{history_go, spa_navigate};
17
18use serde::{Deserialize, Serialize};
19use std::collections::HashMap;
20
21#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
23#[serde(rename_all = "kebab-case")]
24pub enum RouterType {
25 ReactRouter,
27 NextJs,
29 VueRouter,
31 AngularRouter,
33 HistoryApi,
35 Unknown,
37}
38
39impl std::fmt::Display for RouterType {
40 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
41 match self {
42 RouterType::ReactRouter => write!(f, "React Router"),
43 RouterType::NextJs => write!(f, "Next.js"),
44 RouterType::VueRouter => write!(f, "Vue Router"),
45 RouterType::AngularRouter => write!(f, "Angular Router"),
46 RouterType::HistoryApi => write!(f, "History API"),
47 RouterType::Unknown => write!(f, "Unknown"),
48 }
49 }
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
54pub struct SpaRouterInfo {
55 pub router_type: RouterType,
57 pub current_path: String,
59 pub query_params: HashMap<String, String>,
61 pub hash: String,
63 pub can_navigate: bool,
65 pub details: Option<String>,
67}
68
69impl std::fmt::Display for SpaRouterInfo {
70 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
71 writeln!(f, "Router: {}", self.router_type)?;
72 writeln!(f, "Path: {}", self.current_path)?;
73 if !self.query_params.is_empty() {
74 writeln!(f, "Query: {:?}", self.query_params)?;
75 }
76 if !self.hash.is_empty() {
77 writeln!(f, "Hash: #{}", self.hash)?;
78 }
79 writeln!(
80 f,
81 "Can navigate: {}",
82 if self.can_navigate { "yes" } else { "no" }
83 )?;
84 if let Some(ref details) = self.details {
85 writeln!(f, "Details: {}", details)?;
86 }
87 Ok(())
88 }
89}