2828//! let symbol_manager = SymbolManager::with_helper(helper);
2929//! let api = samply_api::Api::new(&symbol_manager);
3030//!
31- //! api.query_api(
31+ //! let api_result = api.query_api(
3232//! "/symbolicate/v5",
3333//! r#"{
3434//! "memoryMap": [
4646//! ]
4747//! ]
4848//! }"#,
49- //! ).await
49+ //! ).await;
50+ //! serde_json::to_string(&api_result).unwrap()
5051//! }
5152//!
5253//! struct ExampleHelper {
@@ -147,7 +148,6 @@ use debugid::DebugId;
147148pub use samply_symbols;
148149pub use samply_symbols:: debugid;
149150use samply_symbols:: { FileAndPathHelper , SymbolManager } ;
150- use serde_json:: json;
151151use source:: SourceApi ;
152152use symbolicate:: SymbolicateApi ;
153153
@@ -158,6 +158,8 @@ mod hex;
158158mod source;
159159mod symbolicate;
160160
161+ pub use error:: Error ;
162+
161163pub ( crate ) fn to_debug_id ( breakpad_id : & str ) -> Result < DebugId , samply_symbols:: Error > {
162164 // Only accept breakpad IDs with the right syntax, and which aren't all-zeros.
163165 match DebugId :: from_breakpad ( breakpad_id) {
@@ -168,6 +170,42 @@ pub(crate) fn to_debug_id(breakpad_id: &str) -> Result<DebugId, samply_symbols::
168170 }
169171}
170172
173+ #[ derive( serde_derive:: Serialize ) ]
174+ pub struct QueryApiJsonResult ( QueryApiJsonResultInner ) ;
175+
176+ #[ derive( serde_derive:: Serialize ) ]
177+ #[ serde( untagged) ]
178+ enum QueryApiJsonResultInner {
179+ SymbolicateResponse ( symbolicate:: response_json:: Response ) ,
180+ SourceResponse ( source:: response_json:: Response ) ,
181+ AsmResponse ( asm:: response_json:: Response ) ,
182+ Err ( Error ) ,
183+ }
184+
185+ impl From < symbolicate:: response_json:: Response > for QueryApiJsonResult {
186+ fn from ( value : symbolicate:: response_json:: Response ) -> Self {
187+ Self ( QueryApiJsonResultInner :: SymbolicateResponse ( value) )
188+ }
189+ }
190+
191+ impl From < source:: response_json:: Response > for QueryApiJsonResult {
192+ fn from ( value : source:: response_json:: Response ) -> Self {
193+ Self ( QueryApiJsonResultInner :: SourceResponse ( value) )
194+ }
195+ }
196+
197+ impl From < asm:: response_json:: Response > for QueryApiJsonResult {
198+ fn from ( value : asm:: response_json:: Response ) -> Self {
199+ Self ( QueryApiJsonResultInner :: AsmResponse ( value) )
200+ }
201+ }
202+
203+ impl From < Error > for QueryApiJsonResult {
204+ fn from ( value : Error ) -> Self {
205+ Self ( QueryApiJsonResultInner :: Err ( value) )
206+ }
207+ }
208+
171209#[ derive( Clone , Copy ) ]
172210pub struct Api < ' a , H : FileAndPathHelper > {
173211 symbol_manager : & ' a SymbolManager < H > ,
@@ -194,18 +232,30 @@ impl<'a, H: FileAndPathHelper> Api<'a, H> {
194232 /// symbol information for that address.
195233 /// - `/asm/v1`: Experimental API. Symbolicates an address and lets you read one of the files in the
196234 /// symbol information for that address.
197- pub async fn query_api ( self , request_url : & str , request_json_data : & str ) -> String {
235+ pub async fn query_api ( self , request_url : & str , request_json_data : & str ) -> QueryApiJsonResult {
236+ self . query_api_fallible ( request_url, request_json_data)
237+ . await
238+ . unwrap_or_else ( |e| e. into ( ) )
239+ }
240+ pub async fn query_api_fallible (
241+ self ,
242+ request_url : & str ,
243+ request_json_data : & str ,
244+ ) -> Result < QueryApiJsonResult , Error > {
198245 if request_url == "/symbolicate/v5" {
199246 let symbolicate_api = SymbolicateApi :: new ( self . symbol_manager ) ;
200- symbolicate_api. query_api_json ( request_json_data) . await
247+ Ok ( symbolicate_api
248+ . query_api_json ( request_json_data)
249+ . await ?
250+ . into ( ) )
201251 } else if request_url == "/source/v1" {
202252 let source_api = SourceApi :: new ( self . symbol_manager ) ;
203- source_api. query_api_json ( request_json_data) . await
253+ Ok ( source_api. query_api_json ( request_json_data) . await ? . into ( ) )
204254 } else if request_url == "/asm/v1" {
205255 let asm_api = AsmApi :: new ( self . symbol_manager ) ;
206- asm_api. query_api_json ( request_json_data) . await
256+ Ok ( asm_api. query_api_json ( request_json_data) . await ? . into ( ) )
207257 } else {
208- json ! ( { "error" : format! ( "Unrecognized URL { request_url}" ) } ) . to_string ( )
258+ Err ( Error :: UnrecognizedUrl ( request_url. into ( ) ) )
209259 }
210260 }
211261}
0 commit comments