@@ -10,14 +10,45 @@ import { AuthUtil } from './authUtil'
1010import * as vscode from 'vscode'
1111import { createCommonButtons } from '../../shared/ui/buttons'
1212import { DataQuickPickItem , showQuickPick } from '../../shared/ui/pickerPrompter'
13- import { codeWhispererClient } from '../client/codewhisperer'
14- import { Customization , ResourceArn } from '../client/codewhispereruserclient'
13+ import CodeWhispererUserClient , { Customization , ResourceArn } from '../client/codewhispereruserclient'
1514import { codicon , getIcon } from '../../shared/icons'
1615import { getLogger } from '../../shared/logger/logger'
1716import { showMessageWithUrl } from '../../shared/utilities/messages'
1817import { parse } from '@aws-sdk/util-arn-parser'
1918import { Commands } from '../../shared/vscode/commands2'
2019import { RegionProfile , vsCodeState } from '../models/model'
20+ import { pageableToCollection } from '../../shared/utilities/collectionUtils'
21+ import { isAwsError } from '../../shared/errors'
22+
23+ export class CustomizationProvider {
24+ constructor (
25+ private readonly client : CodeWhispererUserClient ,
26+ private readonly profile : RegionProfile
27+ ) { }
28+
29+ async listAvailableCustomizations ( ) : Promise < Customization [ ] > {
30+ const requester = async ( request : CodeWhispererUserClient . ListAvailableCustomizationsRequest ) =>
31+ this . client . listAvailableCustomizations ( request ) . promise ( )
32+
33+ try {
34+ const request = { profileArn : this . profile . arn }
35+ const customizations = await pageableToCollection ( requester , request , 'nextToken' , 'customizations' )
36+ . flatten ( )
37+ . promise ( )
38+
39+ return customizations
40+ } catch ( e ) {
41+ const logMsg = isAwsError ( e ) ? `requestId=${ e . requestId } ; message=${ e . message } ` : ( e as Error ) . message
42+ getLogger ( ) . error ( `failed to listAvailableCustomizations: ${ logMsg } ` )
43+ return [ ]
44+ }
45+ }
46+
47+ static async init ( profile : RegionProfile ) : Promise < CustomizationProvider > {
48+ const client = await AuthUtil . instance . regionProfileManager . createQClient ( profile )
49+ return new CustomizationProvider ( client , profile )
50+ }
51+ }
2152
2253/**
2354 *
@@ -336,23 +367,27 @@ export const selectCustomization = async (customization: Customization) => {
336367 )
337368}
338369
339- // should collect all customizations across different profiles and if users select the customization, we also change the profile if needed if the customization is accessible from a different profile
370+ // Should collect all customizations across different profiles and if users select the customization, we also change the profile if needed if the customization is accessible from a different profile.
340371export const getAvailableCustomizationsList = async ( ) => {
341372 const items : ( Customization & { profile : RegionProfile } ) [ ] = [ ]
342- // TODO: try catch listProfile
343- const profiles = await AuthUtil . instance . regionProfileManager . listRegionProfile ( )
373+ const profiles : RegionProfile [ ] = [ ]
374+ try {
375+ const r = await AuthUtil . instance . regionProfileManager . listRegionProfile ( )
376+ profiles . push ( ...r )
377+ } catch ( e ) {
378+ getLogger ( ) . error ( `Failed to list customizations because listAvailableProfiles failed %s` , ( e as Error ) . message )
379+ return [ ]
380+ }
344381
345382 for ( const profile of profiles ) {
346- const response = await codeWhispererClient . listAvailableCustomizations ( profile )
347- for ( const customizations of response . map (
348- ( listAvailableCustomizationsResponse ) => listAvailableCustomizationsResponse . customizations
349- ) ) {
350- for ( const c of customizations ) {
351- items . push ( {
352- ...c ,
353- profile : profile ,
354- } )
355- }
383+ const provider = await CustomizationProvider . init ( profile )
384+ const customizations = await provider . listAvailableCustomizations ( )
385+
386+ for ( const c of customizations ) {
387+ items . push ( {
388+ ...c ,
389+ profile : profile ,
390+ } )
356391 }
357392 }
358393
0 commit comments