@@ -3,7 +3,6 @@ package tfprotov5
33import (
44 "bytes"
55 "encoding/json"
6- "fmt"
76
87 "github.com/hashicorp/terraform-plugin-go/tfprotov5/tftypes"
98)
@@ -127,7 +126,7 @@ func jsonUnmarshalDynamicPseudoType(buf []byte, typ tftypes.Type, p tftypes.Attr
127126 }
128127 switch key {
129128 case "type" :
130- t , err = parseJSONType (rawVal )
129+ t , err = tftypes . ParseJSONType (rawVal )
131130 if err != nil {
132131 return tftypes.Value {}, p .NewErrorf ("error decoding type information: %w" , err )
133132 }
@@ -432,129 +431,3 @@ func jsonUnmarshalObject(buf []byte, attrTypes map[string]tftypes.Type, p tftype
432431 AttributeTypes : attrTypes ,
433432 }, vals ), nil
434433}
435-
436- type jsonType struct {
437- t tftypes.Type
438- }
439-
440- func parseJSONType (buf []byte ) (tftypes.Type , error ) {
441- var t jsonType
442- err := json .Unmarshal (buf , & t )
443- return t .t , err
444- }
445-
446- func (t * jsonType ) UnmarshalJSON (buf []byte ) error {
447- r := bytes .NewReader (buf )
448- dec := json .NewDecoder (r )
449-
450- tok , err := dec .Token ()
451- if err != nil {
452- return err
453- }
454-
455- switch v := tok .(type ) {
456- case string :
457- switch v {
458- case "bool" :
459- t .t = tftypes .Bool
460- case "number" :
461- t .t = tftypes .Number
462- case "string" :
463- t .t = tftypes .String
464- case "dynamic" :
465- t .t = tftypes .DynamicPseudoType
466- default :
467- return fmt .Errorf ("invalid primitive type name %q" , v )
468- }
469-
470- if dec .More () {
471- return fmt .Errorf ("extraneous data after type description" )
472- }
473- return nil
474- case json.Delim :
475- if rune (v ) != '[' {
476- return fmt .Errorf ("invalid complex type description" )
477- }
478-
479- tok , err = dec .Token ()
480- if err != nil {
481- return err
482- }
483-
484- kind , ok := tok .(string )
485- if ! ok {
486- return fmt .Errorf ("invalid complex type kind name" )
487- }
488-
489- switch kind {
490- case "list" :
491- var ety jsonType
492- err = dec .Decode (& ety )
493- if err != nil {
494- return err
495- }
496- t .t = tftypes.List {
497- ElementType : ety .t ,
498- }
499- case "map" :
500- var ety jsonType
501- err = dec .Decode (& ety )
502- if err != nil {
503- return err
504- }
505- t .t = tftypes.Map {
506- AttributeType : ety .t ,
507- }
508- case "set" :
509- var ety jsonType
510- err = dec .Decode (& ety )
511- if err != nil {
512- return err
513- }
514- t .t = tftypes.Set {
515- ElementType : ety .t ,
516- }
517- case "object" :
518- var atys map [string ]jsonType
519- err = dec .Decode (& atys )
520- if err != nil {
521- return err
522- }
523- types := make (map [string ]tftypes.Type , len (atys ))
524- for k , v := range atys {
525- types [k ] = v .t
526- }
527- t .t = tftypes.Object {
528- AttributeTypes : types ,
529- }
530- case "tuple" :
531- var etys []jsonType
532- err = dec .Decode (& etys )
533- if err != nil {
534- return err
535- }
536- types := make ([]tftypes.Type , 0 , len (etys ))
537- for _ , ty := range etys {
538- types = append (types , ty .t )
539- }
540- t .t = tftypes.Tuple {
541- ElementTypes : types ,
542- }
543- default :
544- return fmt .Errorf ("invalid complex type kind name" )
545- }
546-
547- tok , err = dec .Token ()
548- if err != nil {
549- return err
550- }
551- if delim , ok := tok .(json.Delim ); ! ok || rune (delim ) != ']' || dec .More () {
552- return fmt .Errorf ("unexpected extra data in type description" )
553- }
554-
555- return nil
556-
557- default :
558- return fmt .Errorf ("invalid type description" )
559- }
560- }
0 commit comments