pub struct Json<T>(pub T);Expand description
Extractor for JSON data from messages.
Automatically deserializes the message content as JSON into the specified type.
The type must implement serde::Deserialize.
§Errors
Returns an error if:
- The message is not text
- The JSON is malformed
- Required fields are missing
- Type constraints are not satisfied
§Examples
§Simple Struct
use wsforge::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct LoginRequest {
username: String,
password: String,
}
async fn login_handler(Json(req): Json<LoginRequest>) -> Result<String> {
// Validate credentials
Ok(format!("Login attempt by {}", req.username))
}§With Validation
use wsforge::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct CreateUser {
#[serde(deserialize_with = "validate_username")]
username: String,
age: u8,
}
async fn create_user(Json(user): Json<CreateUser>) -> Result<String> {
Ok(format!("Creating user: {}", user.username))
}
§Nested Structures
use wsforge::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct GameState {
player: Player,
score: u32,
}
#[derive(Deserialize)]
struct Player {
id: u64,
name: String,
}
async fn update_game(Json(state): Json<GameState>) -> Result<()> {
println!("Player {} score: {}", state.player.name, state.score);
Ok(())
}Tuple Fields§
§0: TImplementations§
Source§impl<T: Serialize> Json<T>
impl<T: Serialize> Json<T>
Sourcepub fn into_message(self) -> Result<Message>
pub fn into_message(self) -> Result<Message>
Converts this JSON extractor back into a message.
This is useful for echoing back modified data or creating responses.
§Examples
use wsforge::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct Echo {
text: String,
}
async fn echo_handler(Json(data): Json<Echo>) -> Result<Message> {
Json(data).into_message()
}Trait Implementations§
Source§impl<T: DeserializeOwned + Send> FromMessage for Json<T>
impl<T: DeserializeOwned + Send> FromMessage for Json<T>
Source§fn from_message<'life0, 'life1, 'life2, 'life3, 'async_trait>(
message: &'life0 Message,
_conn: &'life1 Connection,
_state: &'life2 AppState,
_extensions: &'life3 Extensions,
) -> Pin<Box<dyn Future<Output = Result<Self>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn from_message<'life0, 'life1, 'life2, 'life3, 'async_trait>(
message: &'life0 Message,
_conn: &'life1 Connection,
_state: &'life2 AppState,
_extensions: &'life3 Extensions,
) -> Pin<Box<dyn Future<Output = Result<Self>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Extracts
Self from the message and context. Read moreAuto Trait Implementations§
impl<T> Freeze for Json<T>where
T: Freeze,
impl<T> RefUnwindSafe for Json<T>where
T: RefUnwindSafe,
impl<T> Send for Json<T>where
T: Send,
impl<T> Sync for Json<T>where
T: Sync,
impl<T> Unpin for Json<T>where
T: Unpin,
impl<T> UnwindSafe for Json<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more