Как гарантировать, что во время компиляции тип будет сериализован в массив JSON? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть черта, которую я использую в качестве интерфейса для ActiveJob Rails;Я хочу, чтобы мой сервер Rust запускал задания, обрабатываемые Rails API:

trait BackgroundJob {
    type Args: Serialize;
    const QUEUE: &'static str;
    const CLASS: JobClass;

    fn payload(self) -> Self::Args;
}

Пример реализации этой черты:

impl BackgroundJob for MyJob {
    type Args = (String,);
    const QUEUE: &'static str = "my_queue";
    const CLASS: JobClass = JobClass::Job1;

    fn payload(self) -> Self::Args {
        (self.payload,)
    }
}

площадка

В моем приложении код немного сложнее (в частности, у меня вместо универсальной функции актер Actix вместо BackgroundJob), но идея та же.

Этот код работает нормальноно я должен убедиться, что все реализации BackgroundJob будут иметь в качестве параметра типа Args что-то, что будет сериализовано в массив JSON (для работы с активным заданием).

Что я хотел быdo - иметь гарантию времени компиляции, что Args будет сериализован в массив.Это возможно?

Я пытался обойтись с чертами SerializeTuple и SerializeSeq от Serde, но безуспешно.

1 Ответ

0 голосов
/ 29 сентября 2018

Я почти уверен, что ответ: «Нет, для Серда нет ничего родного».Никакой черты, соответствующей этой конкретной потребности, нет.

Вы можете создать свою собственную маркерную черту и потребовать ее наличия, но она не будет автоматически реализована ничем;вам придется вручную реализовать его для любого допустимого типа.Я предполагаю, что это не то, что вы хотите:

trait SerializeToJsonArray {}

impl<T> SerializeToJsonArray for Vec<T> {}
impl<T> SerializeToJsonArray for [T] {}
impl<A> SerializeToJsonArray for (A, ) {}
impl<A, B> SerializeToJsonArray for (A, B, ) {}
impl<A, B, C> SerializeToJsonArray for (A, B, C, ) {}
// etc.

trait BackgroundJob {
    type Args: Serialize + SerializeToJsonArray;
}

Это также тривиально разрушаемо - вы можете легко реализовать SerializeToJsonArray для типов, которые не сериализуются вмассив.Точно так же Serde не знает об этой особенности, и вам все равно придется обрабатывать не-массивы во время сериализации.

...