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