1+ use anyhow:: { anyhow, Result } ;
2+ use bytes:: Bytes ;
3+ use futures_util:: Stream ;
4+ use reqwest:: Method ;
5+ use serde:: { de:: DeserializeOwned , Serialize } ;
6+ use std:: collections:: HashMap ;
7+ use std:: pin:: Pin ;
8+
9+ use crate :: core:: client:: base_client:: BaseClient ;
10+ use crate :: core:: client:: config:: ClientConfig ;
11+ use crate :: core:: transport:: http_transoprt:: HttpTransport ;
12+ use crate :: core:: transport:: retry:: RetryPolicy ;
13+ use crate :: core:: transport:: TransportRequest ;
14+
15+ #[ derive( Clone ) ]
16+ pub struct AiClient {
17+ transport : HttpTransport ,
18+ }
19+
20+ impl AiClient {
21+ pub fn new ( config : ClientConfig , retry : RetryPolicy ) -> Result < Self > {
22+ let base_client = BaseClient :: new ( config) ?;
23+ let transport = HttpTransport :: new ( base_client, retry) ;
24+
25+ Ok ( Self { transport } )
26+ }
27+
28+ pub async fn post_json < T > (
29+ & self ,
30+ url : & str ,
31+ headers : HashMap < String , String > ,
32+ body : & impl Serialize ,
33+ ) -> Result < T >
34+ where
35+ T : DeserializeOwned ,
36+ {
37+ let body_bytes = serde_json:: to_vec ( body)
38+ . map_err ( |e| anyhow ! ( "Failed to serialize request body: {}" , e) ) ?;
39+
40+ let request = TransportRequest {
41+ method : Method :: POST ,
42+ url : url. to_string ( ) ,
43+ headers,
44+ body : Some ( Bytes :: from ( body_bytes) ) ,
45+ } ;
46+
47+ let response = self . transport . execute ( request) . await ?;
48+
49+ serde_json:: from_slice ( & response. body )
50+ . map_err ( |e| anyhow ! ( "Failed to deserialize response: {}" , e) )
51+ }
52+
53+ pub async fn get_json < T > (
54+ & self ,
55+ url : & str ,
56+ headers : HashMap < String , String > ,
57+ query : & impl Serialize ,
58+ ) -> Result < T >
59+ where
60+ T : DeserializeOwned ,
61+ {
62+ let query_string = serde_urlencoded:: to_string ( query)
63+ . map_err ( |e| anyhow ! ( "Failed to serialize query: {}" , e) ) ?;
64+
65+ let url_with_query = if query_string. is_empty ( ) {
66+ url. to_string ( )
67+ } else {
68+ format ! ( "{}?{}" , url, query_string)
69+ } ;
70+
71+ let request = TransportRequest {
72+ method : Method :: GET ,
73+ url : url_with_query,
74+ headers,
75+ body : None ,
76+ } ;
77+
78+ let response = self . transport . execute ( request) . await ?;
79+
80+ serde_json:: from_slice ( & response. body )
81+ . map_err ( |e| anyhow ! ( "Failed to deserialize response: {}" , e) )
82+ }
83+
84+ pub async fn post_stream < T > (
85+ & self ,
86+ url : & str ,
87+ headers : HashMap < String , String > ,
88+ body : & impl Serialize ,
89+ ) -> Result < Pin < Box < dyn Stream < Item = Result < T > > + Send + ' static > > >
90+ where
91+ T : DeserializeOwned + Send + ' static ,
92+ {
93+ let body_bytes = serde_json:: to_vec ( body)
94+ . map_err ( |e| anyhow ! ( "Failed to serialize request body: {}" , e) ) ?;
95+
96+ let request = TransportRequest {
97+ method : Method :: POST ,
98+ url : url. to_string ( ) ,
99+ headers,
100+ body : Some ( Bytes :: from ( body_bytes) ) ,
101+ } ;
102+
103+ self . transport . execute_stream ( request) . await . map_err ( |e| anyhow ! ( e) )
104+ }
105+
106+ pub fn transport ( & self ) -> & HttpTransport {
107+ & self . transport
108+ }
109+ }
0 commit comments