odoo_api/client/
odoo_request.rs1use 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}