1use rumtk_core::strings::RUMString;
22
23use crate::css::DEFAULT_OUT_CSS_DIR;
24use crate::utils::defaults::DEFAULT_LOCAL_LISTENING_ADDRESS;
25use crate::utils::matcher::*;
26use crate::{rumtk_web_fetch, rumtk_web_load_conf};
27
28use axum::routing::get;
29use axum::Router;
30use clap::Parser;
31use tower_http::compression::{CompressionLayer, DefaultPredicate};
32use tower_http::services::ServeDir;
33use tracing::error;
34
35#[derive(Parser, Debug)]
39#[command(author, version, about, long_about = None)]
40pub struct Args {
41 #[arg(short, long, default_value = "")]
46 title: RUMString,
47 #[arg(short, long, default_value = "")]
52 description: RUMString,
53 #[arg(short, long, default_value = "")]
57 copyright: RUMString,
58 #[arg(short, long, default_value = DEFAULT_OUT_CSS_DIR)]
67 css_source_dir: RUMString,
68 #[arg(short, long, default_value = DEFAULT_LOCAL_LISTENING_ADDRESS)]
77 ip: RUMString,
78}
79
80pub async fn run_app(args: &Args) {
81 let state = rumtk_web_load_conf!(&args);
82 let comression_layer: CompressionLayer = CompressionLayer::new()
83 .br(true)
84 .deflate(true)
85 .gzip(true)
86 .zstd(true)
87 .compress_when(DefaultPredicate::new());
88 let app = Router::new()
89 .route("/robots.txt", get(rumtk_web_fetch!(default_robots_matcher)))
91 .route(
93 "/component/{*name}",
94 get(rumtk_web_fetch!(default_component_matcher)),
95 )
96 .route("/", get(rumtk_web_fetch!(default_page_matcher)))
98 .route("/{*page}", get(rumtk_web_fetch!(default_page_matcher)))
99 .nest_service("/static", ServeDir::new("static"))
101 .with_state(state)
102 .layer(comression_layer);
103
104 let listener = tokio::net::TcpListener::bind(&args.ip.as_str())
105 .await
106 .expect("There was an issue biding the listener.");
107 println!("listening on {}", listener.local_addr().unwrap());
108
109 axum::serve(listener, app)
110 .await
111 .expect("There was an issue with the server.");
112}
113
114#[macro_export]
115macro_rules! rumtk_web_run_app {
116 ( ) => {{
117 use $crate::{
118 rumtk_web_compile_css_bundle, rumtk_web_init_components, rumtk_web_init_pages,
119 };
120 let args = Args::parse();
121
122 rumtk_web_init_components!(vec![]);
123 rumtk_web_init_pages!(vec![]);
124 rumtk_web_compile_css_bundle!(&args.css_source_dir);
125
126 run_app(args).await;
127 }};
128 ( $pages:expr ) => {{
129 use $crate::{
130 rumtk_web_compile_css_bundle, rumtk_web_init_components, rumtk_web_init_pages,
131 };
132 let args = Args::parse();
133
134 rumtk_web_init_components!(vec![]);
135 rumtk_web_init_pages!($pages);
136 rumtk_web_compile_css_bundle!(&args.css_source_dir);
137
138 run_app(args).await;
139 }};
140 ( $pages:expr, $components:expr ) => {{
141 use $crate::{
142 rumtk_web_compile_css_bundle, rumtk_web_init_components, rumtk_web_init_pages,
143 };
144 let args = Args::parse();
145
146 rumtk_web_init_components!($components);
147 rumtk_web_init_pages!($pages);
148 rumtk_web_compile_css_bundle!(&args.css_source_dir);
149
150 run_app(args).await;
151 }};
152}