@ -2,6 +2,7 @@ package aws
import (
"encoding/json"
"sort"
)
type IAMPolicyDoc struct {
@ -11,12 +12,12 @@ type IAMPolicyDoc struct {
}
type IAMPolicyStatement struct {
Sid string ` json:",omitempty" `
Sid string
Effect string ` json:",omitempty" `
Actions [ ] string ` json:"Action,omitempty" `
NotActions [ ] string ` json:"NotAction,omitempty" `
Resources [ ] string ` json:"Resource,omitempty" `
NotResources [ ] string ` json:"NotResource,omitempty" `
Actions interface { } ` json:"Action,omitempty" `
NotActions interface { } ` json:"NotAction,omitempty" `
Resources interface { } ` json:"Resource,omitempty" `
NotResources interface { } ` json:"NotResource,omitempty" `
Principals IAMPolicyStatementPrincipalSet ` json:"Principal,omitempty" `
NotPrincipals IAMPolicyStatementPrincipalSet ` json:"NotPrincipal,omitempty" `
Conditions IAMPolicyStatementConditionSet ` json:"Condition,omitempty" `
@ -24,51 +25,71 @@ type IAMPolicyStatement struct {
type IAMPolicyStatementPrincipal struct {
Type string
Identifiers [ ] string
Identifiers interface { }
}
type IAMPolicyStatementCondition struct {
Test string
Variable string
Values [ ] string
Values interface { }
}
type IAMPolicyStatementPrincipalSet [ ] IAMPolicyStatementPrincipal
type IAMPolicyStatementConditionSet [ ] IAMPolicyStatementCondition
func ( ps IAMPolicyStatementPrincipalSet ) MarshalJSON ( ) ( [ ] byte , error ) {
raw := map [ string ] [ ] string { }
raw := map [ string ] interface { } { }
for _ , p := range ps {
if _ , ok := raw [ p . Type ] ; ! ok {
raw [ p . Type ] = make ( [ ] string , 0 , len ( p . Identifiers ) )
switch i := p . Identifiers . ( type ) {
case [ ] string :
if _ , ok := raw [ p . Type ] ; ! ok {
raw [ p . Type ] = make ( [ ] string , 0 , len ( i ) )
}
sort . Sort ( sort . Reverse ( sort . StringSlice ( i ) ) )
raw [ p . Type ] = append ( raw [ p . Type ] . ( [ ] string ) , i ... )
case string :
raw [ p . Type ] = i
default :
panic ( "Unsupported data type for IAMPolicyStatementPrincipalSet" )
}
raw [ p . Type ] = append ( raw [ p . Type ] , p . Identifiers ... )
}
return json . Marshal ( & raw )
}
func ( cs IAMPolicyStatementConditionSet ) MarshalJSON ( ) ( [ ] byte , error ) {
raw := map [ string ] map [ string ] [ ] string { }
raw := map [ string ] map [ string ] interface { } { }
for _ , c := range cs {
if _ , ok := raw [ c . Test ] ; ! ok {
raw [ c . Test ] = map [ string ] [ ] string { }
raw [ c . Test ] = map [ string ] interface { } { }
}
if _ , ok := raw [ c . Test ] [ c . Variable ] ; ! ok {
raw [ c . Test ] [ c . Variable ] = make ( [ ] string , 0 , len ( c . Values ) )
switch i := c . Values . ( type ) {
case [ ] string :
if _ , ok := raw [ c . Test ] [ c . Variable ] ; ! ok {
raw [ c . Test ] [ c . Variable ] = make ( [ ] string , 0 , len ( i ) )
}
sort . Sort ( sort . Reverse ( sort . StringSlice ( i ) ) )
raw [ c . Test ] [ c . Variable ] = append ( raw [ c . Test ] [ c . Variable ] . ( [ ] string ) , i ... )
case string :
raw [ c . Test ] [ c . Variable ] = i
default :
panic ( "Unsupported data type for IAMPolicyStatementConditionSet" )
}
raw [ c . Test ] [ c . Variable ] = append ( raw [ c . Test ] [ c . Variable ] , c . Values ... )
}
return json . Marshal ( & raw )
}
func iamPolicyDecodeConfigStringList ( lI [ ] interface { } ) [ ] string {
func iamPolicyDecodeConfigStringList ( lI [ ] interface { } ) interface { } {
if len ( lI ) == 1 {
return lI [ 0 ] . ( string )
}
ret := make ( [ ] string , len ( lI ) )
for i , vI := range lI {
ret [ i ] = vI . ( string )
}
sort . Sort ( sort . Reverse ( sort . StringSlice ( ret ) ) )
return ret
}