Skip to content

Commit

Permalink
cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
suyashkumar committed Jun 10, 2024
1 parent 704440d commit 733cc81
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 32 deletions.
44 changes: 19 additions & 25 deletions write.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"errors"
"fmt"
"io"
"log"
"slices"

"github.com/suyashkumar/dicom/pkg/vrraw"
Expand Down Expand Up @@ -71,10 +70,6 @@ func (w *Writer) writeDataset(ds Dataset) error {
}

bo, implicit, err := ds.transferSyntax()
if (err != nil && err != ErrorElementNotFound) || (err == ErrorElementNotFound && (!w.optSet.defaultMissingTransferSyntax && w.optSet.overrideMissingTransferSyntaxUID == "")) {
return err
}

if errors.Is(err, ErrorElementNotFound) && w.optSet.defaultMissingTransferSyntax {
bo = binary.LittleEndian
implicit = true
Expand All @@ -83,6 +78,8 @@ func (w *Writer) writeDataset(ds Dataset) error {
if err != nil {
return err
}
} else if err != nil {
return err
}

w.writer.SetTransferSyntax(bo, implicit)
Expand Down Expand Up @@ -137,19 +134,23 @@ func SkipValueTypeVerification() WriteOption {
// transferSyntax should not raise an error, and instead the default
// LittleEndian Implicit transfer syntax should be used and written out as a
// Metadata element in the Dataset.
// TODO(suyashkumar): consider deprecating in favor of
// OverrideMissingTransferSyntax.
func DefaultMissingTransferSyntax() WriteOption {
return func(set *writeOptSet) {
set.defaultMissingTransferSyntax = true
}
}

// OverrideMissingTransferSyntaxWith returns a WriteOption indicating that if
// OverrideMissingTransferSyntax returns a WriteOption indicating that if
// the dicom to be written does _not_ have a transfer syntax UID in its metadata
// that it should be written using the provided transferSyntaxUID.
// that it should be written using the provided transferSyntaxUID. A
// transfer syntax uid element with the specified transfer syntax will be
// written to the metadata as well.
//
// If the Writer is unable to recognize or write out using the provided
// If the Writer is unable to recognize or write the dataset using the provided
// transferSyntaxUID, an error will be returned at initialization time.
func OverrideMissingTransferSyntaxWith(transferSyntaxUID string) WriteOption {
func OverrideMissingTransferSyntax(transferSyntaxUID string) WriteOption {
return func(set *writeOptSet) {
set.overrideMissingTransferSyntaxUID = transferSyntaxUID
}
Expand All @@ -166,7 +167,7 @@ type writeOptSet struct {
func (w *writeOptSet) validate() error {
if w.overrideMissingTransferSyntaxUID != "" {
if _, _, err := uid.ParseTransferSyntaxUID(w.overrideMissingTransferSyntaxUID); err != nil {
return fmt.Errorf("unable to parse OverrideMissingTransferSyntaxWith transfer syntax uid %v due to: %s", w.overrideMissingTransferSyntaxUID, err)
return fmt.Errorf("unable to parse OverrideMissingTransferSyntax transfer syntax uid %v due to: %s", w.overrideMissingTransferSyntaxUID, err)
}
}
return nil
Expand All @@ -190,40 +191,33 @@ func writeFileHeader(w *dicomio.Writer, ds *Dataset, metaElems []*Element, opts
tagsUsed[tag.FileMetaInformationGroupLength] = true

err := writeMetaElem(subWriter, tag.FileMetaInformationVersion, ds, &tagsUsed, opts)
if err != nil && err != ErrorElementNotFound {
if err != nil && !errors.Is(err, ErrorElementNotFound) {
return err
}
err = writeMetaElem(subWriter, tag.MediaStorageSOPClassUID, ds, &tagsUsed, opts)
if err != nil && err != ErrorElementNotFound {
if err != nil && !errors.Is(err, ErrorElementNotFound) {
return err
}
err = writeMetaElem(subWriter, tag.MediaStorageSOPInstanceUID, ds, &tagsUsed, opts)
if err != nil && err != ErrorElementNotFound {
if err != nil && !errors.Is(err, ErrorElementNotFound) {
return err
}
log.Println("TEST")
log.Println(opts.overrideMissingTransferSyntaxUID)

err = writeMetaElem(subWriter, tag.TransferSyntaxUID, ds, &tagsUsed, opts)

// TODO(suyashkumar): clean up this logic
if err != nil && err != ErrorElementNotFound || (err == ErrorElementNotFound && (!opts.defaultMissingTransferSyntax && opts.overrideMissingTransferSyntaxUID == "")) {
return err
}

if err == ErrorElementNotFound && opts.defaultMissingTransferSyntax {
if errors.Is(err, ErrorElementNotFound) && opts.defaultMissingTransferSyntax {
// Write the default transfer syntax
if err = writeElement(subWriter, mustNewElement(tag.TransferSyntaxUID, []string{uid.ImplicitVRLittleEndian}), opts); err != nil {
return err
}
}

if err == ErrorElementNotFound && opts.overrideMissingTransferSyntaxUID != "" {
} else if errors.Is(err, ErrorElementNotFound) && opts.overrideMissingTransferSyntaxUID != "" {
// Write the override transfer syntax
if err = writeElement(subWriter, mustNewElement(tag.TransferSyntaxUID, []string{opts.overrideMissingTransferSyntaxUID}), opts); err != nil {
return err
}
log.Println("OVERRIDDEN")
} else if err != nil {
// Return the error if none of the above conditions/overrides apply.
return err
}

for _, elem := range metaElems {
Expand Down
13 changes: 6 additions & 7 deletions write_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -896,8 +896,8 @@ func TestWriteElement(t *testing.T) {
}
}

func TestWrite_OverrideMissingTransferSyntaxWith(t *testing.T) {
ds := Dataset{Elements: []*Element{
func TestWrite_OverrideMissingTransferSyntax(t *testing.T) {
dsWithMissingTS := Dataset{Elements: []*Element{
mustNewElement(tag.MediaStorageSOPClassUID, []string{"1.2.840.10008.5.1.4.1.1.1.2"}),
mustNewElement(tag.MediaStorageSOPInstanceUID, []string{"1.2.3.4.5.6.7"}),
mustNewElement(tag.PatientName, []string{"Bob", "Jones"}),
Expand Down Expand Up @@ -927,14 +927,14 @@ func TestWrite_OverrideMissingTransferSyntaxWith(t *testing.T) {

for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
// Write out dicom with OverrideMissingTransferSyntax option.
writtenDICOM := &bytes.Buffer{}
if err := Write(writtenDICOM, ds, OverrideMissingTransferSyntaxWith(tc.overrideTransferSyntax)); err != nil {
t.Errorf("Write(OverrideMissingTransferSyntaxWith(%v)) returned unexpected error: %v", tc.overrideTransferSyntax, err)
if err := Write(writtenDICOM, dsWithMissingTS, OverrideMissingTransferSyntax(tc.overrideTransferSyntax)); err != nil {
t.Errorf("Write(OverrideMissingTransferSyntax(%v)) returned unexpected error: %v", tc.overrideTransferSyntax, err)
}

// Read dataset back in to see if no roundtrip errors, and also
// Read dataset back in to ensure no roundtrip errors, and also
// check that the written out transfer syntax tag matches.

parsedDS, err := ParseUntilEOF(writtenDICOM, nil)
if err != nil {
t.Fatalf("ParseUntilEOF returned unexpected error when reading written dataset back in: %v", err)
Expand All @@ -953,7 +953,6 @@ func TestWrite_OverrideMissingTransferSyntaxWith(t *testing.T) {
if tsVal[0] != tc.overrideTransferSyntax {
t.Errorf("TransferSyntaxUID in written dicom did not contain the override transfer syntax value. got: %v, want: %v", tsVal[0], tc.overrideTransferSyntax)
}

})
}
}

0 comments on commit 733cc81

Please sign in to comment.