Simplify path segment deserialization code

This commit is contained in:
Jonas Platte 2020-02-08 20:48:50 +01:00
parent b72bb25496
commit abb278c85a
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
3 changed files with 7 additions and 19 deletions

View File

@ -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 _;

View File

@ -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)

View File

@ -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)?
}, },
}) })
} }