@@ -299,6 +299,57 @@ pub mod ar {
299299 get ( ctx, & format ! ( "https://git.sr.ht/{repo}/blob/{branch}/{file}" ) )
300300 }
301301
302+ #[ rhai_fn( return_raw, global) ]
303+ pub fn gnome_extensions ( ctx : NativeCallContext , uuid : & str ) -> Res < String > {
304+ let response_value = get_json_value (
305+ ctx,
306+ & format ! ( "https://extensions.gnome.org/api/v1/extensions/{uuid}/versions/?format=json" ) ,
307+ ) ?;
308+ trace ! ( "Got json from {uuid}:\n {response_value}" ) ;
309+
310+ let results =
311+ response_value. get ( "results" ) . ok_or_else ( || E :: from ( "No json[`results`]?" ) ) ?;
312+ let results_arr =
313+ results. as_array ( ) . ok_or_else ( || E :: from ( "json[`results`] is not array type?" ) ) ?;
314+
315+ // There's both the version name and the internal/fallback version.
316+ // We'll use the internal/fallback version since the version name is optional and not always present.
317+ let mut latest_version = 0 ;
318+ for result in results_arr {
319+ let Some ( result_obj) = result. as_object ( ) else {
320+ continue ;
321+ } ;
322+ let Some ( status_value) = result_obj. get ( "status" ) else {
323+ continue ;
324+ } ;
325+ let Some ( status) = status_value. as_i64 ( ) else {
326+ continue ;
327+ } ;
328+
329+ // Is version marked as "Active"?
330+ if status != 3 {
331+ continue ;
332+ }
333+
334+ let Some ( version_value) = result_obj. get ( "version" ) else {
335+ continue ;
336+ } ;
337+ let Some ( version) = version_value. as_i64 ( ) else {
338+ continue ;
339+ } ;
340+
341+ if version > latest_version {
342+ latest_version = version;
343+ }
344+ }
345+
346+ if latest_version == 0 {
347+ return Err ( E :: from ( "No active extension version could be found!" ) ) ;
348+ }
349+
350+ Ok ( latest_version. to_string ( ) )
351+ }
352+
302353 #[ rhai_fn( skip) ]
303354 pub fn internal_env ( key : & str ) -> Res < String > {
304355 trace ! ( "env(`{key}`) = {:?}" , std:: env:: var( key) ) ;
0 commit comments