1mod detect;
2mod navigate;
3
4pub use detect::detect_router;
5pub use navigate::{history_go, spa_navigate};
6
7use serde::{Deserialize, Serialize};
8use std::collections::HashMap;
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(rename_all = "kebab-case")]
12pub enum RouterType {
13 ReactRouter,
14 NextJs,
15 VueRouter,
16 AngularRouter,
17 HistoryApi,
18 Unknown,
19}
20
21impl std::fmt::Display for RouterType {
22 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23 match self {
24 RouterType::ReactRouter => write!(f, "React Router"),
25 RouterType::NextJs => write!(f, "Next.js"),
26 RouterType::VueRouter => write!(f, "Vue Router"),
27 RouterType::AngularRouter => write!(f, "Angular Router"),
28 RouterType::HistoryApi => write!(f, "History API"),
29 RouterType::Unknown => write!(f, "Unknown"),
30 }
31 }
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct SpaRouterInfo {
36 pub router_type: RouterType,
37 pub current_path: String,
38 pub query_params: HashMap<String, String>,
39 pub hash: String,
40 pub can_navigate: bool,
41 pub details: Option<String>,
42}
43
44impl std::fmt::Display for SpaRouterInfo {
45 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
46 writeln!(f, "Router: {}", self.router_type)?;
47 writeln!(f, "Path: {}", self.current_path)?;
48 if !self.query_params.is_empty() {
49 writeln!(f, "Query: {:?}", self.query_params)?;
50 }
51 if !self.hash.is_empty() {
52 writeln!(f, "Hash: #{}", self.hash)?;
53 }
54 writeln!(
55 f,
56 "Can navigate: {}",
57 if self.can_navigate { "yes" } else { "no" }
58 )?;
59 if let Some(ref details) = self.details {
60 writeln!(f, "Details: {}", details)?;
61 }
62 Ok(())
63 }
64}