diff --git a/Cargo.toml b/Cargo.toml index 9f6b598..1f34229 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,6 @@ tower-sessions-core = "0.9.1" axum = { version = "0.7.0", features = ["macros"] } http-body-util = "0.1" hyper = "1.0" -time = "0.3.31" tokio = { version = "1.20", features = ["macros", "rt-multi-thread"] } tower = "0.4" tower-sessions = "0.9.1" diff --git a/README.md b/README.md index dcd90e2..4d6f3b8 100644 --- a/README.md +++ b/README.md @@ -50,33 +50,20 @@ use axum::{ Router, }; use axum_messages::{Messages, MessagesManagerLayer}; -use time::Duration; -use tower_sessions::{Expiry, MemoryStore, SessionManagerLayer}; +use tower_sessions::{MemoryStore, SessionManagerLayer}; -#[tokio::main] -async fn main() { - let session_store = MemoryStore::default(); - let session_layer = SessionManagerLayer::new(session_store) - .with_secure(false) - .with_expiry(Expiry::OnInactivity(Duration::days(1))); - - let app = Router::new() - .route("/", get(set_messages_handler)) - .route("/read-messages", get(read_messages_handler)) - .layer(MessagesManagerLayer) - .layer(session_layer); +async fn set_messages_handler(messages: Messages) -> impl IntoResponse { + messages + .info("Hello, world!") + .debug("This is a debug message."); - let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); - let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); - axum::serve(listener, app.into_make_service()) - .await - .unwrap(); + Redirect::to("/read-messages") } async fn read_messages_handler(messages: Messages) -> impl IntoResponse { let messages = messages .into_iter() - .map(|message| format!("{:?}: {}", message.level, message)) + .map(|message| format!("{}: {}", message.level, message)) .collect::>() .join(", "); @@ -87,12 +74,22 @@ async fn read_messages_handler(messages: Messages) -> impl IntoResponse { } } -async fn set_messages_handler(messages: Messages) -> impl IntoResponse { - messages - .info("Hello, world!") - .debug("This is a debug message."); +#[tokio::main] +async fn main() { + let session_store = MemoryStore::default(); + let session_layer = SessionManagerLayer::new(session_store).with_secure(false); - Redirect::to("/read-messages") + let app = Router::new() + .route("/", get(set_messages_handler)) + .route("/read-messages", get(read_messages_handler)) + .layer(MessagesManagerLayer) + .layer(session_layer); + + let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); + let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); + axum::serve(listener, app.into_make_service()) + .await + .unwrap(); } ``` diff --git a/examples/basic.rs b/examples/basic.rs index 66a089f..19748d2 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -6,33 +6,20 @@ use axum::{ Router, }; use axum_messages::{Messages, MessagesManagerLayer}; -use time::Duration; -use tower_sessions::{Expiry, MemoryStore, SessionManagerLayer}; +use tower_sessions::{MemoryStore, SessionManagerLayer}; -#[tokio::main] -async fn main() { - let session_store = MemoryStore::default(); - let session_layer = SessionManagerLayer::new(session_store) - .with_secure(false) - .with_expiry(Expiry::OnInactivity(Duration::days(1))); - - let app = Router::new() - .route("/", get(set_messages_handler)) - .route("/read-messages", get(read_messages_handler)) - .layer(MessagesManagerLayer) - .layer(session_layer); +async fn set_messages_handler(messages: Messages) -> impl IntoResponse { + messages + .info("Hello, world!") + .debug("This is a debug message."); - let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); - let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); - axum::serve(listener, app.into_make_service()) - .await - .unwrap(); + Redirect::to("/read-messages") } async fn read_messages_handler(messages: Messages) -> impl IntoResponse { let messages = messages .into_iter() - .map(|message| format!("{:?}: {}", message.level, message)) + .map(|message| format!("{}: {}", message.level, message)) .collect::>() .join(", "); @@ -43,10 +30,20 @@ async fn read_messages_handler(messages: Messages) -> impl IntoResponse { } } -async fn set_messages_handler(messages: Messages) -> impl IntoResponse { - messages - .info("Hello, world!") - .debug("This is a debug message."); +#[tokio::main] +async fn main() { + let session_store = MemoryStore::default(); + let session_layer = SessionManagerLayer::new(session_store).with_secure(false); - Redirect::to("/read-messages") + let app = Router::new() + .route("/", get(set_messages_handler)) + .route("/read-messages", get(read_messages_handler)) + .layer(MessagesManagerLayer) + .layer(session_layer); + + let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); + let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); + axum::serve(listener, app.into_make_service()) + .await + .unwrap(); } diff --git a/src/lib.rs b/src/lib.rs index d97b2b2..aa6f3a2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,33 +12,20 @@ //! Router, //! }; //! use axum_messages::{Messages, MessagesManagerLayer}; -//! use time::Duration; -//! use tower_sessions::{Expiry, MemoryStore, SessionManagerLayer}; +//! use tower_sessions::{MemoryStore, SessionManagerLayer}; //! -//! #[tokio::main] -//! async fn main() { -//! let session_store = MemoryStore::default(); -//! let session_layer = SessionManagerLayer::new(session_store) -//! .with_secure(false) -//! .with_expiry(Expiry::OnInactivity(Duration::days(1))); -//! -//! let app = Router::new() -//! .route("/", get(set_messages_handler)) -//! .route("/read-messages", get(read_messages_handler)) -//! .layer(MessagesManagerLayer) -//! .layer(session_layer); +//! async fn set_messages_handler(messages: Messages) -> impl IntoResponse { +//! messages +//! .info("Hello, world!") +//! .debug("This is a debug message."); //! -//! let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); -//! let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); -//! axum::serve(listener, app.into_make_service()) -//! .await -//! .unwrap(); +//! Redirect::to("/read-messages") //! } //! //! async fn read_messages_handler(messages: Messages) -> impl IntoResponse { //! let messages = messages //! .into_iter() -//! .map(|message| format!("{:?}: {}", message.level, message)) +//! .map(|message| format!("{}: {}", message.level, message)) //! .collect::>() //! .join(", "); //! @@ -49,12 +36,22 @@ //! } //! } //! -//! async fn set_messages_handler(messages: Messages) -> impl IntoResponse { -//! messages -//! .info("Hello, world!") -//! .debug("This is a debug message."); +//! #[tokio::main] +//! async fn main() { +//! let session_store = MemoryStore::default(); +//! let session_layer = SessionManagerLayer::new(session_store).with_secure(false); //! -//! Redirect::to("/read-messages") +//! let app = Router::new() +//! .route("/", get(set_messages_handler)) +//! .route("/read-messages", get(read_messages_handler)) +//! .layer(MessagesManagerLayer) +//! .layer(session_layer); +//! +//! let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); +//! let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); +//! axum::serve(listener, app.into_make_service()) +//! .await +//! .unwrap(); //! } //! ``` #![warn( @@ -136,6 +133,18 @@ pub enum Level { Error = 4, } +impl fmt::Display for Level { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(match self { + Self::Debug => "Debug", + Self::Info => "Info", + Self::Success => "Success", + Self::Warning => "Warning", + Self::Error => "Error", + }) + } +} + #[derive(Debug, Clone, Default, Deserialize, Serialize)] struct Data { pending_messages: MessageQueue, @@ -238,6 +247,26 @@ impl Iterator for Messages { } } +#[async_trait] +impl FromRequestParts for Messages +where + S: Send + Sync, +{ + type Rejection = (StatusCode, &'static str); + + async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result { + parts + .extensions + .get::() + .cloned() + .ok_or(( + StatusCode::INTERNAL_SERVER_ERROR, + "Could not extract messages. Is `MessagesManagerLayer` installed?", + )) + .map(Messages::load) + } +} + /// MIddleware provider `Messages` as a request extension. #[derive(Debug, Clone)] pub struct MessagesManager { @@ -315,44 +344,21 @@ impl Layer for MessagesManagerLayer { } } -#[async_trait] -impl FromRequestParts for Messages -where - S: Send + Sync, -{ - type Rejection = (StatusCode, &'static str); - - async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result { - parts - .extensions - .get::() - .cloned() - .ok_or(( - StatusCode::INTERNAL_SERVER_ERROR, - "Could not extract messages. Is `MessagesManagerLayer` installed?", - )) - .map(|messages| messages.load()) - } -} - #[cfg(test)] mod tests { use axum::{response::Redirect, routing::get, Router}; use axum_core::{body::Body, extract::Request, response::IntoResponse}; use http::header; use http_body_util::BodyExt; - use time::Duration; use tower::ServiceExt; - use tower_sessions::{Expiry, MemoryStore, SessionManagerLayer}; + use tower_sessions::{MemoryStore, SessionManagerLayer}; use super::*; #[tokio::test] async fn basic() { let session_store = MemoryStore::default(); - let session_layer = SessionManagerLayer::new(session_store) - .with_secure(false) - .with_expiry(Expiry::OnInactivity(Duration::days(1))); + let session_layer = SessionManagerLayer::new(session_store).with_secure(false); let app = Router::new() .route("/", get(root)) @@ -363,7 +369,7 @@ mod tests { async fn root(messages: Messages) -> impl IntoResponse { messages .into_iter() - .map(|message| format!("{:?}: {}", message.level, message)) + .map(|message| format!("{}: {}", message.level, message)) .collect::>() .join(", ") }