Simplify path segment deserialization code
This commit is contained in:
parent
b72bb25496
commit
abb278c85a
@ -150,20 +150,16 @@ impl ToTokens for Api {
|
||||
|(i, segment)| {
|
||||
let path_var = &segment[1..];
|
||||
let path_var_ident = Ident::new(path_var, Span::call_site());
|
||||
let path_field = self
|
||||
.request
|
||||
.path_field(path_var)
|
||||
.expect("expected request to have path field");
|
||||
let ty = &path_field.ty;
|
||||
|
||||
quote! {
|
||||
#path_var_ident: {
|
||||
use std::ops::Deref as _;
|
||||
|
||||
let segment = path_segments.get(#i).unwrap().as_bytes();
|
||||
let decoded =
|
||||
ruma_api::exports::percent_encoding::percent_decode(segment)
|
||||
.decode_utf8_lossy();
|
||||
#ty::deserialize(decoded.into_deserializer())
|
||||
.map_err(|e: ruma_api::exports::serde_json::error::Error| e)?
|
||||
ruma_api::exports::serde_json::from_str(decoded.deref())?
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -359,7 +355,7 @@ impl ToTokens for Api {
|
||||
let response_doc = format!("Data in the response from the `{}` API endpoint.", name);
|
||||
|
||||
let api = quote! {
|
||||
use ruma_api::exports::serde::de::{Error as _, IntoDeserializer as _};
|
||||
use ruma_api::exports::serde::de::Error as _;
|
||||
use ruma_api::exports::serde::Deserialize as _;
|
||||
use ruma_api::Endpoint as _;
|
||||
|
||||
|
@ -106,13 +106,6 @@ impl Request {
|
||||
self.fields.iter().filter(|field| field.is_path()).count()
|
||||
}
|
||||
|
||||
/// Gets the path field with the given name.
|
||||
pub fn path_field(&self, name: &str) -> Option<&Field> {
|
||||
self.fields.iter().flat_map(|f| f.field_of_kind(RequestFieldKind::Path)).find(|field| {
|
||||
field.ident.as_ref().expect("expected field to have an identifier") == name
|
||||
})
|
||||
}
|
||||
|
||||
/// Returns the body field.
|
||||
pub fn newtype_body_field(&self) -> Option<&Field> {
|
||||
self.fields.iter().find_map(RequestField::as_newtype_body_field)
|
||||
|
@ -347,11 +347,11 @@ pub struct Metadata {
|
||||
mod tests {
|
||||
/// PUT /_matrix/client/r0/directory/room/:room_alias
|
||||
pub mod create {
|
||||
use std::convert::TryFrom;
|
||||
use std::{convert::TryFrom, ops::Deref};
|
||||
|
||||
use http::{header::CONTENT_TYPE, method::Method};
|
||||
use ruma_identifiers::{RoomAliasId, RoomId};
|
||||
use serde::{de::IntoDeserializer, Deserialize, Serialize};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{Endpoint, FromHttpError, IntoHttpError, Metadata, Outgoing};
|
||||
|
||||
@ -414,8 +414,7 @@ mod tests {
|
||||
room_alias: {
|
||||
let segment = path_segments.get(5).unwrap().as_bytes();
|
||||
let decoded = percent_encoding::percent_decode(segment).decode_utf8_lossy();
|
||||
RoomAliasId::deserialize(decoded.into_deserializer())
|
||||
.map_err(|e: serde_json::error::Error| e)?
|
||||
serde_json::from_str(decoded.deref())?
|
||||
},
|
||||
})
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user