66 "sort"
77 "strings"
88 "text/tabwriter"
9+ "time"
910
1011 cmd2 "github.com/acorn-io/cmd"
1112 "github.com/gptscript-ai/gptscript/pkg/cache"
@@ -46,6 +47,7 @@ func (c *Credential) Run(_ *cobra.Command, _ []string) error {
4647 }
4748 opts .Cache = cache .Complete (opts .Cache )
4849
50+ // Initialize the credential store and get all the credentials.
4951 store , err := credentials .NewStore (cfg , ctx , opts .Cache .CacheDir )
5052 if err != nil {
5153 return fmt .Errorf ("failed to get credentials store: %w" , err )
@@ -56,6 +58,10 @@ func (c *Credential) Run(_ *cobra.Command, _ []string) error {
5658 return fmt .Errorf ("failed to list credentials: %w" , err )
5759 }
5860
61+ w := tabwriter .NewWriter (os .Stdout , 10 , 1 , 3 , ' ' , 0 )
62+ defer w .Flush ()
63+
64+ // Sort credentials and print column names, depending on the options.
5965 if c .AllContexts {
6066 // Sort credentials by context
6167 sort .Slice (creds , func (i , j int ) bool {
@@ -65,25 +71,10 @@ func (c *Credential) Run(_ *cobra.Command, _ []string) error {
6571 return creds [i ].Context < creds [j ].Context
6672 })
6773
68- w := tabwriter .NewWriter (os .Stdout , 10 , 1 , 3 , ' ' , 0 )
69- defer w .Flush ()
70-
7174 if c .ShowEnvVars {
72- _ , _ = w .Write ([]byte ("CONTEXT\t CREDENTIAL\t ENVIRONMENT VARIABLES\n " ))
73-
74- for _ , cred := range creds {
75- envVars := make ([]string , 0 , len (cred .Env ))
76- for envVar := range cred .Env {
77- envVars = append (envVars , envVar )
78- }
79- sort .Strings (envVars )
80- _ , _ = fmt .Fprintf (w , "%s\t %s\t %s\n " , cred .Context , cred .ToolName , strings .Join (envVars , ", " ))
81- }
75+ _ , _ = w .Write ([]byte ("CONTEXT\t CREDENTIAL\t EXPIRES IN\t ENV\n " ))
8276 } else {
83- _ , _ = w .Write ([]byte ("CONTEXT\t CREDENTIAL\n " ))
84- for _ , cred := range creds {
85- _ , _ = fmt .Fprintf (w , "%s\t %s\n " , cred .Context , cred .ToolName )
86- }
77+ _ , _ = w .Write ([]byte ("CONTEXT\t CREDENTIAL\t EXPIRES IN\n " ))
8778 }
8879 } else {
8980 // Sort credentials by tool name
@@ -92,24 +83,49 @@ func (c *Credential) Run(_ *cobra.Command, _ []string) error {
9283 })
9384
9485 if c .ShowEnvVars {
95- w := tabwriter .NewWriter (os .Stdout , 10 , 1 , 3 , ' ' , 0 )
96- defer w .Flush ()
97- _ , _ = w .Write ([]byte ("CREDENTIAL\t ENVIRONMENT VARIABLES\n " ))
98-
99- for _ , cred := range creds {
100- envVars := make ([]string , 0 , len (cred .Env ))
101- for envVar := range cred .Env {
102- envVars = append (envVars , envVar )
103- }
104- sort .Strings (envVars )
105- _ , _ = fmt .Fprintf (w , "%s\t %s\n " , cred .ToolName , strings .Join (envVars , ", " ))
86+ _ , _ = w .Write ([]byte ("CREDENTIAL\t EXPIRES IN\t ENV\n " ))
87+ } else {
88+ _ , _ = w .Write ([]byte ("CREDENTIAL\t EXPIRES IN\n " ))
89+ }
90+ }
91+
92+ for _ , cred := range creds {
93+ expires := "never"
94+ if cred .ExpiresAt != nil {
95+ if ! cred .IsExpired () {
96+ expires = cred .ExpiresAt .Sub (time .Now ()).Truncate (time .Second ).String ()
97+ } else {
98+ expires = "expired"
10699 }
100+ }
101+
102+ var fields []any
103+ if c .AllContexts {
104+ fields = []any {cred .Context , cred .ToolName , expires }
107105 } else {
108- for _ , cred := range creds {
109- fmt .Println (cred .ToolName )
106+ fields = []any {cred .ToolName , expires }
107+ }
108+
109+ if c .ShowEnvVars {
110+ envVars := make ([]string , 0 , len (cred .Env ))
111+ for envVar := range cred .Env {
112+ envVars = append (envVars , envVar )
110113 }
114+ sort .Strings (envVars )
115+ fields = append (fields , strings .Join (envVars , ", " ))
111116 }
117+
118+ printFields (w , fields )
112119 }
113120
114121 return nil
115122}
123+
124+ func printFields (w * tabwriter.Writer , fields []any ) {
125+ if len (fields ) == 0 {
126+ return
127+ }
128+
129+ fmtStr := strings .Repeat ("%s\t " , len (fields )- 1 ) + "%s\n "
130+ _ , _ = fmt .Fprintf (w , fmtStr , fields ... )
131+ }
0 commit comments