Как я могу реализовать Serialize, используя существующую реализацию свойства Display? - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу реализовать черту Serialize для типа во внешнем ящике, но это запрещено.Я посмотрел на удаленный производный serde , но, похоже, много работы по переписыванию типов.

В моем случае все типы, которые я хочу сериализовать, реализуют черту Display,а для сериализации я просто хочу использовать эту черту.

Как бы я это сделал?

1 Ответ

1 голос
/ 25 сентября 2019

Вот моя попытка (примечание: я ОП):

use serde::{Serialize, Serializer};
use std::io::Error;
use std::fmt::Display;

#[derive(Debug, Serialize)]
pub enum MyError {
    Custom,
    #[serde(serialize_with = "use_display")]
    Io(Error)
}

fn use_display<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
    T: Display,
    S: Serializer
{
    serializer.collect_str(value)
}

детская площадка

Но, может быть, есть более простой способ сделать это?

...