config-rsを使用してTOMLファイルから設定をロードしています。列をデニール化してenumにしたいとします。私はdeserialize_with
serde_deriveの機能を使って解決しようとしましたが、関数の署名を満たすのに適切なErrorを返す方法がわかりません。どうすれば達成できますか?config-rsを使用してTOML文字列をenumにデシリアライズ
私の依存関係:列挙型RotationPolicyType
をデシリアライズすることを意図しています
config = "0.7"
serde_derive = "1.0"
serde = "1.0"
toml = "0.4"
コード例:と
error[E0106]: missing lifetime specifier
--> src/settings.rs:30:94
|
30 | fn deserialize_with<D>(deserializer: D) -> Result<RotationPolicyType, D::Error> where D: Deserializer {
| ^^^^^^^^^^^^ expected lifetime parameter
error: aborting due to previous error
コンパイルエラー:deserialize_withと
extern crate config;
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate toml;
use std::env;
use config::{Config, Environment, File};
use std::path::PathBuf;
use serde;
use serde::de::Deserializer;
use serde::Deserialize;
#[derive(Debug, Deserialize, Clone)]
pub enum RotationPolicyType {
ByDuration,
ByDay,
}
#[derive(Debug, Deserialize, Clone)]
pub struct FileConfig {
pub rotations: i32,
#[serde(deserialize_with="deserialize_with")]
pub rotation_policy_type: RotationPolicyType,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Settings {
pub threads: usize,
pub file_writer: FileConfig,
}
impl Settings {
pub fn new() -> Self {
let mut s = Config::new();
s.merge(File::with_name("config/default")).unwrap();
s.merge(File::with_name("config/local").required(false))
.unwrap();
s.merge(Environment::with_prefix("app")).unwrap();
s.deserialize().unwrap()
}
}
fn deserialize_with<D>(deserializer: D) -> Result<RotationPolicyType, D::Error> where D: Deserializer {
let s = String::deserialize(deserializer)?;
match s.as_ref() {
"ByDuration" => Ok(RotationPolicyType::ByDuration),
"ByDay" => Ok(RotationPolicyType::ByDay),
_ => Err(serde::de::Error::custom("error trying to deserialize rotation policy config"))
}
}
fn deserialize_with2<'de, D>(deserializer: &'de mut D) -> Result<RotationPolicyType, D::Error> where &'de mut D: Deserializer<'de> {
let s = String::deserialize(deserializer)?;
match s.as_ref() {
"ByDuration" => Ok(RotationPolicyType::ByDuration),
"ByDay" => Ok(RotationPolicyType::ByDay),
_ => Err(serde::de::Error::custom("error trying to deserialize rotation policy config"))
}
}
コンパイルエラーdeserialize_with2:すべての
error[E0220]: associated type `Error` not found for `D`
--> src/settings.rs:42:90
|
42 | fn deserialize_with2<'de, D>(deserializer: &'de mut D) -> Result<RotationPolicyType, D::Error> where &'de mut D: Deserializer<'de> {
| ^^^^^^^^ associated type `Error` not found
error: aborting due to previous error
*私は*成功しなかった - なぜあなたは成功しませんでしたどのように表示されませんでしたか?コードはコンパイルされませんか?コードは期待どおりに機能しませんか?何が起こった?どのTOMLファイルを解読しようとしましたか? – Shepmaster
コメントありがとうございます。私の試みで質問を更新してください。 – cspinetta
Serde自体に[ここで期待されるものの例](https://github.com/serde-rs/serde/blob/master/serde/src/de/mod.rs#L262)があります。具体的には、あなたは 'Error :: custom(....)'を使いたいと思うようです。 –