github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/gosbom/formats/gosbomjson/model/source.go (about) 1 package model 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "strconv" 7 8 "github.com/nextlinux/gosbom/gosbom/source" 9 ) 10 11 // Source object represents the thing that was cataloged 12 type Source struct { 13 ID string `json:"id"` 14 Type string `json:"type"` 15 Target interface{} `json:"target"` 16 } 17 18 // sourceUnpacker is used to unmarshal Source objects 19 type sourceUnpacker struct { 20 ID string `json:"id,omitempty"` 21 Type string `json:"type"` 22 Target json.RawMessage `json:"target"` 23 } 24 25 // UnmarshalJSON populates a source object from JSON bytes. 26 func (s *Source) UnmarshalJSON(b []byte) error { 27 var unpacker sourceUnpacker 28 if err := json.Unmarshal(b, &unpacker); err != nil { 29 return err 30 } 31 32 s.Type = unpacker.Type 33 s.ID = unpacker.ID 34 35 switch s.Type { 36 case "directory", "file": 37 if target, err := strconv.Unquote(string(unpacker.Target)); err == nil { 38 s.Target = target 39 } else { 40 s.Target = string(unpacker.Target[:]) 41 } 42 43 case "image": 44 var payload source.ImageMetadata 45 if err := json.Unmarshal(unpacker.Target, &payload); err != nil { 46 return err 47 } 48 s.Target = payload 49 50 default: 51 return fmt.Errorf("unsupported package metadata type: %+v", s.Type) 52 } 53 54 return nil 55 }