このコードの有効期間の間の関係を理解できません。基本的には、という1つのキーを持つx-www-form-urlencoded
データを受け取るRocket APIがあります。このキーには直感的にパーセントコードでエンコードされた構造体Message<T>
のJSON値が含まれています。FromForm内でJSONを逆シリアル化するライフタイム
は簡単に私がFromForm
を実装しています、From<Message<T>>
よう要求ガードとして使用するために(私は、これは次善のAPIの設計であるが、これはリバースエンジニアリングを仕事であるので、私は何のオプションが用意されていません注意してくださいね)。そのためにはMessage<T>
にはFromForm<'f>
を実装する必要があります。ここで、T
はDeserialize<'de>
です。私はimpl<'f, 'de, T> FromForm<'f> for Message<T> where T: Deserialize<'de>
と私のインプラントの署名を書いた。実際にデコードを実行するには
、I:
- フォームデータの
"json"
キーを取得します。 - URLデコードの値。
- 値に含まれるJSONを解析します。
できるだけ早く救済します。その(読者の便宜のために明示的な型注釈を)やっコード:ペーストとランウェイ(それはロケットに依存するので、プレイグラウンドでは動作しません)で
fn from_form(items: &mut FormItems<'f>, strict: bool) -> Result<Self, Self::Error> {
// Get JSON field
let encoded: Option<&RawStr> = items.find(|&(k, _)| k.as_str() == "json")
.map(|(_, v)| v);
if let None = encoded {
return Err(MessageFormError::MissingJsonKey);
}
// Decode URL-string
let decoded: Result<String, Utf8Error> = encoded.unwrap().url_decode();
if let Err(e) = decoded {
return Err(MessageFormError::InvalidUrl(e));
}
// Parse JSON
let json: String = decoded.unwrap();
serde_json::from_str::<Self>(&json) // Line 205
.map_err(|e| MessageFormError::InvalidJson(e))
}
A Gist demonstrating the problem。
私が理解したよう:
encoded
の&RawStr
は寿命'f
を持っています。String
が機能serde_json
の端部が'x
は、'de
と一致する必要はない&'x str
をとり、その値を返す(それはの終わりに住んまで住んでいる、url_decode
によってそれから作成されますそれが返されるので、関数は、および、
)、それを超えて移動します。しかし、それは私の理解が間違っているようだ:
205 | serde_json::from_str::<Self>(&json)
| ^^^^ does not live long enough
206 | .map_err(|e| MessageFormError::InvalidJson(e))
207 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'f as defined on the impl at 184:1...
--> src/transport.rs:184:1
|
184 |/impl<'f, T> FromForm<'f> for Message<T>
185 | | where T: Deserialize<'f>
186 | | {
187 | | type Error = MessageFormError;
... |
207 | | }
208 | | }
| |_^
Whを私が間違っていると、どのように私は正しくdeserialized値を返すことができますか?
よりも長生きしないので、Tが URLデコードデータから借りることは許されないことを通信します置くことができます[playground](https://play.rust-lang.com)のコードを簡単に再現できるようにしますか?一見すると、生涯「f」と「de」との間には、欠けている関係があるようです。 –
@ E_net4遊び場にはロケットの箱がないので、悲しいことです。私はファイルに貼り付けることができるより完全な例を作ります。 – Kroltan
@ E_net4 gist!が追加されました! – Kroltan