use axum::{extract::State, routing::get, Router};
use axum_session::{Session, SessionConfig, SessionLayer, SessionStore};
use axum_session_redispool::SessionRedisPool;
use redis_pool::{RedisPool, SingleRedisPool};
use std::net::SocketAddr;
use tokio::net::TcpListener;
use tracing::Level;
use tracing_subscriber::FmtSubscriber;
#[tokio::main]
async fn main() {
let redis_url = "redis://default@127.0.0.1:6379/0";
let subscriber = FmtSubscriber::builder()
.with_max_level(Level::TRACE)
.finish();
tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed");
let client =
redis::Client::open(redis_url).expect("Error while trying to open the redis connection");
let pool = RedisPool::from(client);
let session_config = SessionConfig::default();
let session_store =
SessionStore::<SessionRedisPool>::new(Some(pool.clone().into()), session_config)
.await
.unwrap();
let app = Router::new()
.route("/", get(root))
.route("/counter", get(counter))
.layer(SessionLayer::new(session_store))
.with_state(pool);
let listener = TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(
listener,
app.into_make_service_with_connect_info::<SocketAddr>(),
)
.await
.unwrap();
}
async fn root() -> &'static str {
"Hello, World!"
}
async fn counter(session: Session<SessionRedisPool>, pool: State<SingleRedisPool>) -> String {
let mut count: usize = session.get("count").unwrap_or(0);
count += 1;
session.set("count", count);
let new_count = session.get::<usize>("count").expect("error setting count");
let count: i64 = redis::cmd("DBSIZE")
.query_async(&mut pool.acquire().await.unwrap())
.await
.unwrap();
format!("We have set the counter to redis: {new_count}, DBSIZE: {count}")
}