@@ -2,20 +2,28 @@ package secret
22
33import (
44 "context"
5+ "encoding/json"
6+ "fmt"
7+ "reflect"
58
69 "github.com/scaleway/scaleway-cli/v2/internal/core"
710 secret "github.com/scaleway/scaleway-sdk-go/api/secret/v1beta1"
811)
912
13+ type customAccessSecretVersionRequest struct {
14+ secret.AccessSecretVersionRequest
15+ Field * string
16+ Raw bool
17+ }
18+
1019func GetCommands () * core.Commands {
1120 cmds := GetGeneratedCommands ()
12-
13- cmds .MustFind ("secret" , "version" , "create" ).Override (dataCreateVersion )
21+ cmds .MustFind ("secret" , "version" , "create" ).Override (secretVersionCreateData )
1422 cmds .MustFind ("secret" , "version" , "access" ).Override (secretVersionAccessCommand )
1523 return cmds
1624}
1725
18- func dataCreateVersion (c * core.Command ) * core.Command {
26+ func secretVersionCreateData (c * core.Command ) * core.Command {
1927 * c .ArgSpecs .GetByName ("data" ) = core.ArgSpec {
2028 Name : "data" ,
2129 Short : "Content of the secret version. Base64 is handled by the SDK" ,
@@ -26,19 +34,65 @@ func dataCreateVersion(c *core.Command) *core.Command {
2634}
2735
2836func secretVersionAccessCommand (c * core.Command ) * core.Command {
29- c .Run = func (ctx context.Context , args interface {}) (i interface {}, e error ) {
30- request := args .(* secret.AccessSecretVersionRequest )
37+ c .ArgsType = reflect .TypeOf (customAccessSecretVersionRequest {})
38+
39+ c .ArgSpecs .AddBefore ("region" , & core.ArgSpec {
40+ Name : "field" ,
41+ Short : "Return only the JSON field of the given name" ,
42+ })
3143
44+ c .ArgSpecs .AddBefore ("region" , & core.ArgSpec {
45+ Name : "raw" ,
46+ Short : "Return only the raw payload" ,
47+ })
48+
49+ c .Run = func (ctx context.Context , args interface {}) (i interface {}, e error ) {
3250 client := core .ExtractClient (ctx )
3351 api := secret .NewAPI (client )
34- res , err := api .AccessSecretVersion (request )
3552
53+ request := args .(* customAccessSecretVersionRequest )
54+
55+ response , err := api .AccessSecretVersion (& secret.AccessSecretVersionRequest {
56+ Region : request .Region ,
57+ SecretID : request .SecretID ,
58+ Revision : request .Revision ,
59+ })
3660 if err != nil {
3761 return nil , err
3862 }
3963
40- return core .RawResult (res .Data ), nil
64+ if request .Field != nil {
65+ response .Data , err = getSecretVersionField (response .Data , * request .Field )
66+ if err != nil {
67+ return nil , err
68+ }
69+ }
70+
71+ if request .Raw {
72+ return core .RawResult (response .Data ), nil
73+ }
74+
75+ return response , nil
4176 }
4277
4378 return c
4479}
80+
81+ func getSecretVersionField (data []byte , field string ) ([]byte , error ) {
82+ var rawFields interface {}
83+ if err := json .Unmarshal (data , & rawFields ); err != nil {
84+ return nil , fmt .Errorf ("cannot unmarshal JSON data" )
85+ }
86+
87+ rawField , ok := rawFields .(map [string ]interface {})[field ]
88+ if ! ok {
89+ return nil , fmt .Errorf ("JSON field is not present" )
90+ }
91+
92+ switch field := rawField .(type ) {
93+ case string :
94+ return []byte (field ), nil
95+ default :
96+ return nil , fmt .Errorf ("JSON field type is not valid" )
97+ }
98+ }
0 commit comments