Я недавно начал использовать ржавчину и работаю над библиотекой. Следующее работает, но похоже на дублирование кода
#[cfg(feature = "serde_support")]
use serde::Serialize;
#[cfg(not(feature = "serde_support"))]
pub struct Teststruct<T>
{
graph: T
}
#[cfg(feature = "serde_support")]
#[derive(Serialize)]
pub struct Teststruct<T>
where T: Serialize
{
graph: T
}
Обратите внимание, что, хотя ограничение черты where T: Serialize
в данном примере не является строго обязательным, является необходимым в задаче I в настоящее время сталкиваюсь.
Таким образом, вышеприведенное выглядит для меня как ненужное дублирование кода, особенно если структуры содержат больше полей. Я предпочел бы написать что-то вроде:
#[cfg(feature = "serde_support")]
use serde::Serialize;
#[cfg_attr(feature = "serde_support", derive(Serialize))]
pub struct Teststruct<T: Node>
where T: Serialize,
Graph<T>: Serialize + DeserializeOwned
{
graph: Graph<T>
}
Теперь, однако, я могу компилировать только с функцией "serde_support" - без этой функции я, очевидно, получаю ошибку: Serialize
не найден в этой области .
Я пытался найти что-то вроде cfg_attr для границы черты, но безрезультатно.
Есть ли элегантный способ избежать дублирования кода?