Как говорится в сообщении об ошибке (немного очищено):
expected type `fn(Value) -> Result<EnumIr, FromValueError>`
found type `fn(Value) -> Result<EnumIr, mysql::Error>`
Вы не можете вернуть неправильный тип; это просто фундаментальное условие статически типизированного языка. Вместо этого верните правильный тип: Result<EnumIr, mysql::FromValueError>
.
Я также изменил ваш код, чтобы избежать ложного повторного разбора данных в строку:
#[derive(Debug)]
pub struct EnumIr {
string: String,
}
impl ConvIr<UserRole> for EnumIr {
fn new(v: Value) -> Result<EnumIr, mysql::FromValueError> {
match v {
Value::Bytes(bytes) => match String::from_utf8(bytes) {
Ok(string) => Ok(EnumIr { string }),
Err(e) => Err(mysql::FromValueError(Value::Bytes(e.into_bytes()))),
},
v => Err(mysql::FromValueError(v)),
}
}
fn commit(self) -> UserRole {
self.string.parse().unwrap()
}
fn rollback(self) -> Value {
Value::Bytes(self.string.into_bytes())
}
}
Также кажется, что вы должны попытаться проанализировать перечисление в методе new
, так как это единственный метод, который допускает Result
:
#[derive(Debug)]
pub struct EnumIr {
role: UserRole,
string: String,
}
impl ConvIr<UserRole> for EnumIr {
fn new(v: Value) -> Result<EnumIr, mysql::FromValueError> {
match v {
Value::Bytes(bytes) => match String::from_utf8(bytes) {
Ok(string) => match string.parse() {
Ok(role) => Ok(EnumIr { role, string }),
Err(_) => Err(mysql::FromValueError(Value::Bytes(string.into_bytes()))),
},
Err(e) => Err(mysql::FromValueError(Value::Bytes(e.into_bytes()))),
},
v => Err(mysql::FromValueError(v)),
}
}
fn commit(self) -> UserRole {
self.role
}
fn rollback(self) -> Value {
Value::Bytes(self.string.into_bytes())
}
}