@@ -507,6 +507,7 @@ pub fn start_jsonrpc_server() {
507507 } ;
508508
509509 let mut handlers = HandlersKeyedByMethodName :: new ( Arc :: new ( context) ) ;
510+ handlers. add_request_handler ( "info" , handle_info) ;
510511 handlers. add_request_handler ( "configure" , handle_configure) ;
511512 handlers. add_request_handler ( "refresh" , handle_refresh) ;
512513 handlers. add_request_handler ( "resolve" , handle_resolve) ;
@@ -516,6 +517,29 @@ pub fn start_jsonrpc_server() {
516517 start_server ( & handlers)
517518}
518519
520+ #[ derive( Debug , Clone , Deserialize , Serialize ) ]
521+ #[ serde( rename_all = "camelCase" ) ]
522+ pub struct InfoResponse {
523+ pub pet_version : String ,
524+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
525+ pub build_id : Option < String > ,
526+ }
527+
528+ impl InfoResponse {
529+ fn current ( ) -> Self {
530+ Self {
531+ pet_version : env ! ( "CARGO_PKG_VERSION" ) . to_string ( ) ,
532+ build_id : option_env ! ( "PET_BUILD_ID" )
533+ . filter ( |value| !value. is_empty ( ) )
534+ . map ( ToString :: to_string) ,
535+ }
536+ }
537+ }
538+
539+ pub fn handle_info ( _context : Arc < Context > , id : u32 , _params : Value ) {
540+ send_reply ( id, Some ( InfoResponse :: current ( ) ) ) ;
541+ }
542+
519543#[ derive( Debug , Clone , Deserialize , Serialize ) ]
520544#[ serde( rename_all = "camelCase" ) ]
521545pub struct ConfigureOptions {
@@ -1512,6 +1536,17 @@ mod tests {
15121536 ) ;
15131537 }
15141538
1539+ #[ test]
1540+ fn test_info_response_uses_package_version_and_optional_build_id ( ) {
1541+ let info = InfoResponse :: current ( ) ;
1542+
1543+ assert_eq ! ( info. pet_version, env!( "CARGO_PKG_VERSION" ) ) ;
1544+ assert ! ( info
1545+ . build_id
1546+ . as_deref( )
1547+ . is_none_or( |build_id| !build_id. is_empty( ) ) ) ;
1548+ }
1549+
15151550 #[ test]
15161551 fn test_parse_refresh_options_rejects_non_empty_array ( ) {
15171552 assert ! ( parse_refresh_options( json!( [ { "searchKind" : "Conda" } ] ) ) . is_err( ) ) ;
0 commit comments