Я создаю библиотеку на Rust, в которой есть метод send
, выполняющий HTTP-запросы к локальному RPC-серверу с помощью reqwest.
Этот метод возвращает универсальный тип R
в Result
, где R: DeserializeOwned
. После создания правильных типов для каждого ответа serde_json::from_str()
может дать мне тип.
Если на запрос нет ответа, как я могу заставить send
возвращать что-то значимое?
Это код, который у меня есть сейчас:
fn send<R, T>(
&self,
request: &RpcRequest<T>,
) -> Result<R, ApiError>
where
T: Serialize + Debug,
R: DeserializeOwned + Debug,
let res = serde_json::from_str(&buf).map_err(|err| ClientError::Json(err))
Теперь я вынужден создать и вернуть Err
, но технически запрос, не возвращающий ответа, является ожидаемым поведением, поэтому я хочу вернуть что-то отличное от Err
.
Я попытался обойти это, обернув R
с Option
, но это означает, что я должен дважды разворачивать каждый ответ, и 98% ответов от reqwest действительно содержат данные в своем ответе, так что это немного похоже на излишество.
Я тоже пытался вернуть самодельный тип EmptyResponse
, но компилятор жалуется: expected type R, found type EmptyResponse
. Я думаю, что вернуть тип EmptyResponse
было бы то, что я хочу, но, возможно, кто-то может дать несколько советов о том, как сделать это еще лучше.
EmptyResponse
был бы тем, что я хочу — это невозможно: ошибка «Параметр ожидаемого типа» в конструктор универсальной структуры. - person Shepmaster   schedule 06.02.2019send
), знаете ли вы заранее, будет ли ответ (в случае успеха) содержать данные или нет? Или вы делаете запрос, не зная, действительно ли будет возвращенR
? - person trentcl   schedule 06.02.2019send<(), _>
работает? Если вызывающая сторона знает, что ничего не ожидает, то она не должна указыватьsend
на десериализацию во что-то - person trentcl   schedule 06.02.2019