From b3cd8d066df88b675ad223f58048b0592c0d472f Mon Sep 17 00:00:00 2001 From: Yann Simon Date: Fri, 11 Oct 2024 10:06:50 +0200 Subject: [PATCH] state always need to implement Clone (#2972) --- axum/src/extract/state.rs | 50 --------------------------------------- 1 file changed, 50 deletions(-) diff --git a/axum/src/extract/state.rs b/axum/src/extract/state.rs index e72c2e11..21abde91 100644 --- a/axum/src/extract/state.rs +++ b/axum/src/extract/state.rs @@ -21,9 +21,6 @@ use std::{ /// // /// // here you can put configuration, database connection pools, or whatever /// // state you need -/// // -/// // see "When states need to implement `Clone`" for more details on why we need -/// // `#[derive(Clone)]` here. /// #[derive(Clone)] /// struct AppState {} /// @@ -247,53 +244,6 @@ use std::{ /// } /// ``` /// -/// # When states need to implement `Clone` -/// -/// Your top level state type must implement `Clone` to be extractable with `State`: -/// -/// ``` -/// use axum::extract::State; -/// -/// // no substates, so to extract to `State` we must implement `Clone` for `AppState` -/// #[derive(Clone)] -/// struct AppState {} -/// -/// async fn handler(State(state): State) { -/// // ... -/// } -/// ``` -/// -/// This works because of [`impl FromRef for S where S: Clone`][`FromRef`]. -/// -/// This is also true if you're extracting substates, unless you _never_ extract the top level -/// state itself: -/// -/// ``` -/// use axum::extract::{State, FromRef}; -/// -/// // we never extract `State`, just `State`. So `AppState` doesn't need to -/// // implement `Clone` -/// struct AppState { -/// inner: InnerState, -/// } -/// -/// #[derive(Clone)] -/// struct InnerState {} -/// -/// impl FromRef for InnerState { -/// fn from_ref(app_state: &AppState) -> InnerState { -/// app_state.inner.clone() -/// } -/// } -/// -/// async fn api_users(State(inner): State) { -/// // ... -/// } -/// ``` -/// -/// In general however we recommend you implement `Clone` for all your state types to avoid -/// potential type errors. -/// /// # Shared mutable state /// /// [As state is global within a `Router`][global] you can't directly get a mutable reference to