@@ -40,10 +40,44 @@ func diagnosticResult(format string, args ...any) tfprotov5.ListResourceResult {
4040 },
4141 },
4242 }
43+ }
44+
45+ // Mimic SDK GRPCProviderServer.ReadResource ResourceData -> MsgPack
46+ func NewProtoV5ListResult (d * sdk.ResourceData , displayName string ) tfprotov5.ListResourceResult {
47+ state := d .State ()
48+ if state == nil {
49+ return diagnosticResult ("Expected state to be non-nil" )
50+ }
4351
52+ schemaBlock := sdkResource .CoreConfigSchema ()
53+ if schemaBlock == nil {
54+ return diagnosticResult ("Expected schemaBlock to be non-nil" )
55+ }
56+
57+ // We've copied hcl2shim wholesale for purposes of making the test pass
58+ newStateVal , err := hcl2shim .HCL2ValueFromFlatmap (state .Attributes , schemaBlock .ImpliedType ())
59+ if err != nil {
60+ return diagnosticResult ("Error converting state attributes to HCL2 value: %v" , err )
61+ }
62+
63+ // Think about this later
64+ // newStateVal = normalizeNullValues(newStateVal, stateVal, false)
65+
66+ pack , err := msgpack .Marshal (newStateVal , schemaBlock .ImpliedType ())
67+ if err != nil {
68+ return diagnosticResult ("Error marshaling new state value to MsgPack: %v" , err )
69+ }
70+
71+ fmt .Printf ("MsgPack: %s\n " , pack )
72+
73+ listResult := tfprotov5.ListResourceResult {}
74+ listResult .Resource = & tfprotov5.DynamicValue {MsgPack : pack }
75+ listResult .DisplayName = displayName
76+
77+ return listResult
4478}
45- func listFunc (ctx context.Context , req list.ListRequest , stream * list.ListResultsStream ) {
4679
80+ func listFunc (ctx context.Context , req list.ListRequest , stream * list.ListResultsStream ) {
4781 // This likely gets refactored info as an "adapter" / "mux" concern.
4882 sdkResource , ok := SDKResourceFromContext (ctx )
4983 if ! ok {
@@ -71,65 +105,27 @@ func listFunc(ctx context.Context, req list.ListRequest, stream *list.ListResult
71105
72106 displayName := "I am Groot"
73107
74- // Mimic SDK GRPCProviderServer.ReadResource ResourceData -> MsgPack
75- // All this logic belongs in an "adapter" concern
76- //
77- // e.g. NewProtoV5ListResult(data *ResourceData, displayName string, diag sdkdiag.Diagnostics)
78- state := d .State ()
79- if state == nil {
80- push (diagnosticResult ("Expected state to be non-nil" ))
81- return
82- }
83-
84- schemaBlock := sdkResource .CoreConfigSchema ()
85- if schemaBlock == nil {
86- push (diagnosticResult ("Expected schemaBlock to be non-nil" ))
87- return
88- }
89-
90- // We've copied hcl2shim wholesale for purposes of making the test pass
91- newStateVal , err := hcl2shim .HCL2ValueFromFlatmap (state .Attributes , schemaBlock .ImpliedType ())
92- if err != nil {
93- push (diagnosticResult ("Error converting state attributes to HCL2 value: %v" , err ))
94- return
95- }
96-
97- // Think about this later
98- // newStateVal = normalizeNullValues(newStateVal, stateVal, false)
99-
100- pack , err := msgpack .Marshal (newStateVal , schemaBlock .ImpliedType ())
101- if err != nil {
102- push (diagnosticResult ("Error marshaling new state value to MsgPack: %v" , err ))
103- return
104- }
105-
106- fmt .Printf ("MsgPack: %s\n " , pack )
107-
108- // Construct a tfprotov5.ListResourceResult
109- listResult := tfprotov5.ListResourceResult {}
110- listResult .Resource = & tfprotov5.DynamicValue {MsgPack : pack }
111- listResult .DisplayName = displayName
112-
108+ listResult := NewProtoV5ListResult (d , displayName )
113109 if ! push (listResult ) {
114110 return
115111 }
116112 }
117113}
118114
119- func TestServerListResourceProto5ToProto5 (t * testing.T ) {
120- t .Parallel ()
121-
122- server := func (listResource func () list.ListResource ) * Server {
123- return & Server {
124- FrameworkServer : fwserver.Server {
125- Provider : & testprovider.Provider {
126- ListResourcesMethod : func (ctx context.Context ) []func () list.ListResource {
127- return []func () list.ListResource {listResource }
128- },
115+ func newServer (listResource func () list.ListResource ) * Server {
116+ return & Server {
117+ FrameworkServer : fwserver.Server {
118+ Provider : & testprovider.Provider {
119+ ListResourcesMethod : func (ctx context.Context ) []func () list.ListResource {
120+ return []func () list.ListResource {listResource }
129121 },
130122 },
131- }
123+ },
132124 }
125+ }
126+
127+ func TestServerListResourceProto5ToProto5 (t * testing.T ) {
128+ t .Parallel ()
133129
134130 listResource := func () list.ListResource {
135131 return & testprovider.ListResource {
@@ -139,15 +135,16 @@ func TestServerListResourceProto5ToProto5(t *testing.T) {
139135 },
140136 }
141137 }
142- aServer := server (listResource )
138+
139+ server := newServer (listResource )
143140
144141 ctx := context .Background ()
145142 ctx = NewContextWithSDKResource (ctx , & sdkResource )
146143 req := & tfprotov5.ListResourceRequest {
147144 TypeName : "test_resource" ,
148145 }
149146
150- stream , err := aServer .ListResource (ctx , req )
147+ stream , err := server .ListResource (ctx , req )
151148 if err != nil {
152149 t .Fatalf ("unexpected error returned from ListResource: %v" , err )
153150 }
0 commit comments