Anton
Anton
спасибо!
Anton
Вобщем суть, если нужно просто свою ошибку вернуть юзать бэйл, если же нужно обработать std ошибку или еще какую левую, то заимплементить From<Error> и отматчить какую ошибку вернуть
Anton
теперь все прям понятно стало, збс
Andrey
bail!(x) это всего навсего
return Err(x);
Anton
хотя может я где то в другом месте накосячил и поэтому не компилилось
Andrey
return Err(x.into())
Aleksey
Или return Err(x)?
Денис
Да, чё-то я с бейлом наверное перегнул, лучше уж return Err(...into())
Денис
Хотя ещё лучше возвращать failure::Error)
Денис
а, блин, into как раз и надо с failure::Error юзать
Денис
bail!() превращается в Error: ErrorMessage { msg: Variant1 },
.into() превращается в Error: Variant1
Denys
Denys
Denys
Denys
Да вроде не, только этот клон все равно странно выглядит, надо как доберусь до компа глянуть что там
Rostyslav
Денис
position возвращает номер элемента в массиве
Денис
fn position<P>(&mut self, predicate: P) -> Option<usize>
Denys
?
Denys
Screenshot (Apr 14, 2018 13:20:47)
Denys
Он возражает оптион юсайз
Denys
Это предикат бул возвр должен
Rostyslav
position возвращает номер элемента в массиве
Хм, я так и подумал и даже так и сделал, хоть иде подсказывает, что тот возвращает бул.
Энивей, если запихнуть это всё вместе с предиктом внутрь ремува, код получается ужасным и я дальше не понимаю, в чём разница.
Денис
))
Rostyslav
Ну, вот так он выглядит у меня, хз:
let index = self.get_mut_parent_by_val(&value).get_mut_children().iter_mut().position(|child| {
child.get_value().clone().unwrap() == value
}).unwrap();
self.get_mut_parent_by_val(&value).get_mut_children().remove(index);
Rostyslav
Против:
self.get_mut_parent_by_val(&value).get_mut_children().retain(|child| {
child.get_value().clone().unwrap() != value
});
Filipp
Клон анврап ради сравнения это сильно
Filipp
А выше вижу обсуждали уже
Rostyslav
В любом случае буду это рефакторить, для начала нужно что бы работало.
Anton
Посоны
Anton
новый микро тред тупых вопросов относительно десериализатора serde
Anton
собсно у меня есть json, и есть поля со значениями - но в некоторых полях есть возможность использовать несколько типов
Anton
ну типо может быть строка, и может быть объект
Денис
кстати, чё-то тут подумал, вместо return Err(MyEnumError::Variant1.into()); можно писать return Err(MyEnumError::Variant1)?;
Anton
и как бы нужно както обработать отдельно десериализатор, в некоторых местах
Денис
Anton
но писать с нуля имплементацию Deserializer
Денис
дык
Денис
а зачем?
Anton
тоесть по максимуму где можно чтобы он юзал только #derive[Deserealizer]
Денис
мне кажется проще сделать один енум и потом его конвертить во что нужно
Anton
но у меня есть хуйни где можно и строкой значение, и объектом
Денис
а самому Deserialize имплементить — это мне кажется хуже смерти
պլհկ
Читай главу enum representation в доке серде
Денис
ага, вот эту https://serde.rs/enum-representations.html
Anton
автоматический десериализатор позволит только объектное значение первого типа
Денис
то если или объект или строка, так?
Денис
ща
Anton
но если строка - я бы хотел чтобы у меня была возможность самому настроить какое значение вернуть
Anton
Anton
и чтобы если это была строка, был другой обработчик
Маjко
Зачем так?
Anton
Зачем так?
упрощение в некоторых местах нужно, иначе слишком дохуя строк кода будет, так что в двух вариантах чтоб было
Маjко
Нет, ты не понял
Зачем 2 варианта?
Anton
ну я пример привел
Anton
у меня есть свойства
պլհկ
serde(untagged)
/thread
Anton
которые при стандартном десеализаторе требуют дохуя кода писать для json
Маjко
պլհկ
Че за дохуя кода-то
Anton
в то время как я бы мог получить Value и все отдельно для разных типов обработать
Anton
Че за дохуя кода-то
бля, ну давай более реалистичный пример, градиенты. У меня градиент может быть просто объектом - в котором я пишу только начальный и финальный цвет с позицией, а может быть массивом, в котором у меня перечисляются все стоп поинты.
Anton
И мне нужно чтобы была возможность для отдельных типов полей самому заимплементить поведение десериализации из Value объекта
պլհկ
У тебя енум из 2 вариантов
Anton
т.е ты хочешь сказать что лучше для значения просто сделать енум?
Anton
Ну типо
enum BackgroundGradient {
Arr(...),
Obj(...)
}
Anton
и там проставить типы?
Anton
ну так выходной тип то все равно один получается
Anton
я думал есть возможность сделать типо имплементацию какого простого трейта, для того чтобы обработать json enum Value и возвратить значение уже готовое
պլհկ
enum Gradient {
Simple(SimpleGradient),
Complex(Vec<Point>)
}