mirror of
https://codeberg.org/slatian/service.echoip-slatecave.git
synced 2024-11-10 08:37:21 +01:00
Made it a git repo
This commit is contained in:
commit
afdec2b8a2
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/target
|
1418
Cargo.lock
generated
Normal file
1418
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
13
Cargo.toml
Normal file
13
Cargo.toml
Normal file
@ -0,0 +1,13 @@
|
||||
[package]
|
||||
name = "rust-web-thingy"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
axum = "0.6"
|
||||
rand = "0.8"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
tera = "1"
|
99
src/main.rs
Normal file
99
src/main.rs
Normal file
@ -0,0 +1,99 @@
|
||||
use axum::{
|
||||
extract::Query,
|
||||
extract::State,
|
||||
http::StatusCode,
|
||||
response::Html,
|
||||
Router,
|
||||
routing::get,
|
||||
};
|
||||
use tera::Tera;
|
||||
|
||||
use std::net::{IpAddr, Ipv4Addr};
|
||||
use std::sync::Arc;
|
||||
|
||||
#[derive(serde::Deserialize, serde::Serialize)]
|
||||
enum ResponseFormat {
|
||||
#[serde(rename="text/plain", alias="text")]
|
||||
TextPlain,
|
||||
#[serde(rename="text/html", alias="html")]
|
||||
TextHtml,
|
||||
#[serde(rename="application/json", alias="json")]
|
||||
ApplicationJson,
|
||||
}
|
||||
|
||||
impl ToString for ResponseFormat {
|
||||
fn to_string(&self) -> String {
|
||||
match self {
|
||||
ResponseFormat::TextPlain => "text/plain".to_string(),
|
||||
ResponseFormat::TextHtml => "text/html".to_string(),
|
||||
ResponseFormat::ApplicationJson => "application/json".to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize, serde::Serialize)]
|
||||
struct IpQuery {
|
||||
ip: Option<IpAddr>,
|
||||
format: Option<ResponseFormat>,
|
||||
}
|
||||
|
||||
struct ServiceSharedState {
|
||||
tera: Tera,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
// Initalize Tera templates
|
||||
// TODO: don't hardcode template directory
|
||||
let tera = match Tera::new("templates/*.html") {
|
||||
Ok(t) => t,
|
||||
Err(e) => {
|
||||
println!("Template parsing error(s): {}", e);
|
||||
::std::process::exit(1);
|
||||
}
|
||||
};
|
||||
// Initialize shared state
|
||||
let shared_state = Arc::new(ServiceSharedState{
|
||||
tera: tera,
|
||||
});
|
||||
|
||||
// Initalize axum server
|
||||
let app = Router::new()
|
||||
.route("/", get(handle_default_route))
|
||||
.route("/hi", get(hello_world_handler))
|
||||
.with_state(shared_state)
|
||||
;
|
||||
|
||||
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
|
||||
.serve(app.into_make_service())
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
async fn hello_world_handler() -> &'static str {
|
||||
"Hello, there, you, awesome creature!"
|
||||
}
|
||||
|
||||
async fn handle_default_route(
|
||||
Query(ip_query): Query<IpQuery>,
|
||||
State(arc_state): State<Arc<ServiceSharedState>>,
|
||||
) -> Result<Html<String>,StatusCode> {
|
||||
|
||||
let address = ip_query.ip.unwrap_or(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)));
|
||||
let format = ip_query.format.unwrap_or(ResponseFormat::TextHtml);
|
||||
let format_string = format.to_string();
|
||||
|
||||
let state = Arc::clone(&arc_state);
|
||||
let mut context = tera::Context::new();
|
||||
context.insert("ip", &address);
|
||||
context.insert("format", &format_string);
|
||||
|
||||
match state.tera.render("index.html", &context) {
|
||||
Ok(html) => Ok(Html(html)),
|
||||
Err(e) => {
|
||||
println!("There was an error while rendering index.html: {e}");
|
||||
Err(StatusCode::INTERNAL_SERVER_ERROR)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
10
templates/index.html
Normal file
10
templates/index.html
Normal file
@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Your IP: {{ ip }}</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Your IP-Address is: {{ ip }}</h1>
|
||||
<p>Your requested format was: <b>{{format}}</b></p>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user