odoo_api/client/
odoo_request.rs

1//! The [`OdooRequest`] type and associated bits
2
3use super::RequestImpl;
4use crate::client::error::ParseResponseResult;
5use crate::jsonrpc::{JsonRpcParams, JsonRpcRequest, JsonRpcResponse};
6use serde::de::DeserializeOwned;
7use serde::Serialize;
8use serde_json::from_str;
9use std::fmt::Debug;
10
11pub struct OdooRequest<'a, T, I>
12where
13    T: JsonRpcParams + Debug + Serialize,
14    T::Container<T>: Debug + Serialize,
15    I: RequestImpl,
16{
17    pub(crate) data: JsonRpcRequest<T>,
18    pub(crate) url: String,
19    pub(crate) session_id: Option<&'a str>,
20    pub(crate) _impl: &'a I,
21}
22
23impl<'a, T, I> OdooRequest<'a, T, I>
24where
25    T: JsonRpcParams + Debug + Serialize,
26    T::Container<T>: Debug + Serialize,
27    I: RequestImpl,
28{
29    pub(crate) fn new(
30        data: JsonRpcRequest<T>,
31        url: String,
32        session_id: Option<&'a str>,
33        _impl: &'a I,
34    ) -> Self {
35        Self {
36            data,
37            url,
38            session_id,
39            _impl,
40        }
41    }
42
43    pub(crate) fn parse_response<D: Debug + DeserializeOwned>(
44        &self,
45        data: &str,
46    ) -> ParseResponseResult<D> {
47        let response: JsonRpcResponse<D> = from_str(data)?;
48
49        match response {
50            JsonRpcResponse::Success(data) => Ok(data.result),
51            JsonRpcResponse::Error(data) => Err(data.error.into()),
52        }
53    }
54}