коллекция? Может трейт какой-то попросить?
pub fn next_opt<T: for<'de> Deserialize<'de>>(
arg: Option<serde_json::Value>,
) -> Result<Option<T>>
хочу десериализовывать из Value Option<T> по такому принципу:
`T` or `[T]` => Some(T)
`None` or `[]` => None
array of several elements => error
но есть проблемка:
- на next_opt<String>(Some(json!( ["a"] ))) мне нужно раскрывать массив прежде чем десериализовывать
- а на next_opt<Vec<String>>(Some(json!( ["a"] ))) раскрывать массив не нужно, нужно десериализовывать из массива тк T это массив
Как быть?
Сделать свой трейт. Реализовать его для String и Vec<String>, требовать его в next_opt
Коллекции обычно итератор реализуют
ну я же не могу это узнать в рантайме? Могу либо потребовать итератор, либо не требовать, т.е. это путь с next_opt_scalar и next_opt_collection
Вообще такое скорее всего через свой десериализатор пилить надо
Реализовать разную обработку для T и Vec<T> пока не получится. Для этого нужна специализация. Поэтому String и Vec<String>
подозреваю что там вылезет похожая проблема
Untagged enum же как-то десериализуют
и то верно
перебирает варианты просто
Ну тут так же примерно можно
пробует, ловит ошибку, пробует следующий?
Serde will try to match the data against each variant in order and the first one that deserializes successfully is the one returned. https://serde.rs/enum-representations.html#untagged
Угу, это я знаю, просто думал вдруг вы знаете как оно реализовано :) Через перехват ошибки или как-то умнее спасибо!
Обсуждают сегодня