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  }