@@ -10,6 +10,7 @@ import (
1010 "github.com/hashicorp/terraform-plugin-framework/datasource/schema"
1111 "github.com/hashicorp/terraform-plugin-framework/path"
1212 "github.com/hashicorp/terraform-plugin-framework/types"
13+ "google.golang.org/protobuf/encoding/protojson"
1314
1415 openfga "github.com/openfga/go-sdk"
1516 "github.com/openfga/language/pkg/go/transformer"
@@ -98,8 +99,8 @@ func (d *AuthorizationModelDocumentDataSource) Read(ctx context.Context, req dat
9899 }
99100
100101 model := state .Model
101- jsonString := state .Json .ValueStringPointer ()
102102 dslString := state .Dsl .ValueStringPointer ()
103+ jsonString := state .Json .ValueStringPointer ()
103104
104105 if model != nil {
105106 result , err := json .Marshal (state .Model )
@@ -111,43 +112,48 @@ func (d *AuthorizationModelDocumentDataSource) Read(ctx context.Context, req dat
111112 jsonString = openfga .PtrString (string (result ))
112113 }
113114
114- if jsonString != nil {
115- result , err := transformer .TransformJSONStringToDSL ( * jsonString )
115+ if dslString != nil {
116+ result , err := transformer .TransformDSLToJSON ( * dslString )
116117 if err != nil {
117- resp .Diagnostics .AddError ("Input Error" , fmt .Sprintf ("Unable to transform JSON into DSL , got error: %s" , err ))
118+ resp .Diagnostics .AddError ("Input Error" , fmt .Sprintf ("Unable to transform DSL into JSON , got error: %s" , err ))
118119 return
119120 }
120121
121- dslString = result
122+ jsonString = openfga . PtrString ( result )
122123 }
123124
124- if dslString == nil {
125- resp .Diagnostics .AddError ("Input Error" , "DSL is undefined" )
125+ if jsonString == nil {
126+ resp .Diagnostics .AddError ("Input Error" , "JSON is undefined" )
126127 return
127128 }
128129
129- // Transform DSL to canonical JSON form
130- unstableResult , err := transformer .TransformDSLToJSON (* dslString )
130+ modelProto , err := transformer .LoadJSONStringToProto (* jsonString )
131131 if err != nil {
132- resp .Diagnostics .AddError ("Input Error" , fmt .Sprintf ("Unable to transform DSL into JSON , got error: %s" , err ))
132+ resp .Diagnostics .AddError ("Input Error" , fmt .Sprintf ("Unable to transform JSON into Proto , got error: %s" , err ))
133133 return
134134 }
135135
136- var tmp any
137- err = json . Unmarshal ([] byte ( unstableResult ), & tmp )
136+ marshaller := protojson. MarshalOptions { EmitDefaultValues : true }
137+ unstableJsonBytes , err := marshaller . Marshal ( modelProto )
138138 if err != nil {
139139 resp .Diagnostics .AddError ("Input Error" , fmt .Sprintf ("Unable to bring JSON in canonical form, got error: %s" , err ))
140140 return
141141 }
142- stableResultBytes , err := json .Marshal (tmp )
142+
143+ var sanitizedAuthorizationModel AuthorizationModelWithoutId
144+ err = json .Unmarshal (unstableJsonBytes , & sanitizedAuthorizationModel )
143145 if err != nil {
144146 resp .Diagnostics .AddError ("Input Error" , fmt .Sprintf ("Unable to bring JSON in canonical form, got error: %s" , err ))
145147 return
146148 }
147149
148- stableResult := string (stableResultBytes )
150+ stableResultBytes , err := json .Marshal (sanitizedAuthorizationModel )
151+ if err != nil {
152+ resp .Diagnostics .AddError ("Input Error" , fmt .Sprintf ("Unable to bring JSON in canonical form, got error: %s" , err ))
153+ return
154+ }
149155
150- state .Result = types .StringValue (stableResult )
156+ state .Result = types .StringValue (string ( stableResultBytes ) )
151157
152158 resp .Diagnostics .Append (resp .State .Set (ctx , & state )... )
153159}
0 commit comments