Я создаю библиотеку в 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
было бы тем, что я хочу, но, возможно, кто-то может пролить несколько советов о том, как, возможно, сделать это еще лучше.