reader.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
  2. package json
  3. import (
  4. "bytes"
  5. "encoding/json"
  6. "fmt"
  7. "io"
  8. "github.com/spdx/tools-golang/convert"
  9. "github.com/spdx/tools-golang/spdx"
  10. "github.com/spdx/tools-golang/spdx/common"
  11. "github.com/spdx/tools-golang/spdx/v2/v2_1"
  12. "github.com/spdx/tools-golang/spdx/v2/v2_2"
  13. "github.com/spdx/tools-golang/spdx/v2/v2_3"
  14. )
  15. // Read takes an io.Reader and returns a fully-parsed current model SPDX Document
  16. // or an error if any error is encountered.
  17. func Read(content io.Reader) (*spdx.Document, error) {
  18. doc := spdx.Document{}
  19. err := ReadInto(content, &doc)
  20. return &doc, err
  21. }
  22. // ReadInto takes an io.Reader, reads in the SPDX document at the version provided
  23. // and converts to the doc version
  24. func ReadInto(content io.Reader, doc common.AnyDocument) error {
  25. if !convert.IsPtr(doc) {
  26. return fmt.Errorf("doc to read into must be a pointer")
  27. }
  28. buf := new(bytes.Buffer)
  29. _, err := buf.ReadFrom(content)
  30. if err != nil {
  31. return err
  32. }
  33. var data interface{}
  34. err = json.Unmarshal(buf.Bytes(), &data)
  35. if err != nil {
  36. return err
  37. }
  38. val, ok := data.(map[string]interface{})
  39. if !ok {
  40. return fmt.Errorf("not a valid SPDX JSON document")
  41. }
  42. version, ok := val["spdxVersion"]
  43. if !ok {
  44. return fmt.Errorf("JSON document does not contain spdxVersion field")
  45. }
  46. switch version {
  47. case v2_1.Version:
  48. var doc v2_1.Document
  49. err = json.Unmarshal(buf.Bytes(), &doc)
  50. if err != nil {
  51. return err
  52. }
  53. data = doc
  54. case v2_2.Version:
  55. var doc v2_2.Document
  56. err = json.Unmarshal(buf.Bytes(), &doc)
  57. if err != nil {
  58. return err
  59. }
  60. data = doc
  61. case v2_3.Version:
  62. var doc v2_3.Document
  63. err = json.Unmarshal(buf.Bytes(), &doc)
  64. if err != nil {
  65. return err
  66. }
  67. data = doc
  68. default:
  69. return fmt.Errorf("unsupported SDPX version: %s", version)
  70. }
  71. return convert.Document(data, doc)
  72. }