File size: 3,280 Bytes
9853ca3 a1d7a8d 9853ca3 2ae0f81 9853ca3 e704ac3 2ae0f81 a1d7a8d 9853ca3 e294884 9853ca3 e294884 9853ca3 e704ac3 9853ca3 e294884 9853ca3 e294884 9853ca3 e294884 9853ca3 e294884 9853ca3 e294884 9853ca3 e294884 9853ca3 e294884 adea619 e294884 2ae0f81 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | use axum::{
response::Html as AxumHtml,
routing::get,
Router,
};
use std::env;
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(index_handler))
.route("/health", get(|| async { "ok" }));
let port = env::var("PORT").unwrap_or_else(|_| "7860".to_string());
let addr = format!("0.0.0.0:{}", port);
let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
axum::serve(listener, app).await.unwrap();
}
async fn index_handler() -> AxumHtml<String> {
// Список товаров
let products = vec![
("Rust Ferris", "29.99 $", "https://rustacean.net/assets/rustacean-flat-gesture.png", "Мягкий краб Феррис."),
("Turbo Engine", "49.99 $", "https://foundation.rust-lang.org/img/rust-logo-blk.svg", "Максимальная скорость."),
("Safe Shield", "15.00 $", "https://www.rust-lang.org/static/images/rust-logo-blk.svg", "Безопасность памяти."),
];
let mut cards = String::new();
for p in products {
cards.push_str(&format!(
r#"<div class="bg-white rounded-xl shadow-md overflow-hidden border border-gray-100 p-4">
<img src="{}" class="h-40 w-full object-contain mb-4">
<h3 class="text-lg font-bold">{}</h3>
<p class="text-sm text-gray-500 mb-4">{}</p>
<div class="flex justify-between items-center">
<span class="text-orange-600 font-bold text-xl">{}</span>
<button class="bg-black text-white px-3 py-1 rounded shadow hover:bg-orange-600 transition">Купить</button>
</div>
</div>"#,
p.2, p.0, p.3, p.1
));
}
let html = format!(
r#"<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://cdn.tailwindcss.com"></script>
<title>Rust Store</title>
</head>
<body class="bg-gray-50 font-sans">
<nav class="bg-white shadow-sm p-4 sticky top-0 z-10">
<div class="max-w-6xl mx-auto flex justify-between items-center">
<h1 class="text-2xl font-black text-orange-600 tracking-tighter">RUST SHOP</h1>
<div class="space-x-4 text-gray-600 font-medium">
<a href="#">Каталог</a>
<a href="#">Доставка</a>
</div>
</div>
</nav>
<main class="max-w-6xl mx-auto p-8">
<div class="mb-12 text-center">
<h2 class="text-4xl font-extrabold text-gray-900 mb-2">Надежный мерч на Rust</h2>
<p class="text-gray-500">Скомпилировано для вашего комфорта</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
{}
</div>
</main>
<footer class="text-center py-10 text-gray-400 text-sm border-t mt-10">
© 2026 Rust Axum Store | Hugging Face Spaces
</footer>
</body>
</html>"#,
cards
);
AxumHtml(html)
} |