@@ -4,20 +4,24 @@ import (
4
4
"bufio"
5
5
"bytes"
6
6
"fmt"
7
+ "io"
8
+ "os"
9
+ "strings"
10
+
7
11
"github.com/okieraised/go2com/internal/constants"
8
12
"github.com/okieraised/go2com/internal/utils"
9
13
"github.com/okieraised/go2com/pkg/dicom/dataset"
10
14
"github.com/okieraised/go2com/pkg/dicom/element"
11
15
"github.com/okieraised/go2com/pkg/dicom/reader"
12
16
"github.com/okieraised/go2com/pkg/dicom/tag"
13
- //_ "github.com/okieraised/go2com/pkg/dicom/tag"
14
17
"github.com/okieraised/go2com/pkg/dicom/uid"
15
- "io"
16
- "strings"
17
18
)
18
19
19
20
// Parser implements the field required to parse the dicom file
20
21
type Parser struct {
22
+ filePath string
23
+ fileContent []byte
24
+ fileReader * io.Reader
21
25
reader reader.DcmReader
22
26
dataset dataset.Dataset
23
27
metadata dataset.Dataset
@@ -26,11 +30,13 @@ type Parser struct {
26
30
skipPixelData bool
27
31
}
28
32
33
+ // Deprecated: this initialization will be triggered by calling init() in tag pkg
29
34
func InitTagDict () {
30
35
tag .InitTagDict ()
31
36
}
32
37
33
38
// NewParser returns a new dicom parser
39
+ // Deprecated: NewParser will be replaced by NewDCMFileParser
34
40
func NewParser (fileReader io.Reader , fileSize int64 , skipPixelData , skipDataset bool ) (* Parser , error ) {
35
41
dcmReader := reader .NewDcmReader (bufio .NewReader (fileReader ), skipPixelData )
36
42
parser := Parser {
@@ -42,41 +48,65 @@ func NewParser(fileReader io.Reader, fileSize int64, skipPixelData, skipDataset
42
48
return & parser , nil
43
49
}
44
50
45
- func (p * Parser ) Parse () error {
46
- defer func () error {
47
- if r := recover (); r != nil {
48
- return fmt .Errorf ("handled panic caused by the library: %s" , fmt .Sprint (r ))
49
- }
50
- return nil
51
- }()
52
-
53
- p .setFileSize ()
54
- err := p .validateDicom ()
51
+ // NewDCMFileParser creates new parser from input file path with default options or with user-specified options
52
+ func NewDCMFileParser (filePath string , options ... func (* Parser )) (* Parser , error ) {
53
+ f , err := os .Open (filePath )
55
54
if err != nil {
56
- return err
55
+ panic ( err )
57
56
}
58
- err = p .parseMetadata ()
57
+
58
+ fInfo , err := f .Stat ()
59
59
if err != nil {
60
- return err
60
+ return nil , err
61
61
}
62
- if p .skipDataset {
63
- return nil
62
+ dcmReader := reader .NewDICOMReader (bufio .NewReader (f ))
63
+ parser := & Parser {
64
+ reader : dcmReader ,
65
+ fileSize : fInfo .Size (),
64
66
}
65
- err = p .parseDataset ()
66
- if err != nil {
67
- return err
67
+ for _ , opt := range options {
68
+ opt (parser )
68
69
}
69
- return nil
70
+
71
+ return parser , nil
72
+ }
73
+
74
+ func WithSkipPixelData (skipPixelData bool ) func (* Parser ) {
75
+ return func (s * Parser ) {
76
+ s .skipPixelData = skipPixelData
77
+ }
78
+ }
79
+
80
+ func WithSkipDataset (skipPixelDataset bool ) func (* Parser ) {
81
+ return func (s * Parser ) {
82
+ s .skipPixelData = skipPixelDataset
83
+ }
84
+ }
85
+
86
+ //----------------------------------------------------------------------------------------------------------------------
87
+
88
+ func (p * Parser ) Parse () error {
89
+ return p .parse ()
70
90
}
71
91
72
92
// GetMetadata returns the file meta header
73
- func (p * Parser ) GetMetadata () dataset.Dataset {
74
- return p .metadata
93
+ func (p * Parser ) GetMetadata () (* dataset.Dataset , error ) {
94
+ err := p .parse ()
95
+ if err != nil {
96
+ return nil , err
97
+ }
98
+
99
+ return & p .metadata , nil
75
100
}
76
101
77
102
// GetDataset returns the dataset
78
- func (p * Parser ) GetDataset () dataset.Dataset {
79
- return p .dataset
103
+ func (p * Parser ) GetDataset () (* dataset.Dataset , error ) {
104
+ err := p .parse ()
105
+ if err != nil {
106
+ return nil , err
107
+ }
108
+
109
+ return & p .dataset , nil
80
110
}
81
111
82
112
// GetElementByTagString returns the element value of the input tag
@@ -105,6 +135,26 @@ func (p *Parser) GetElementByTagString(tagStr string) (interface{}, error) {
105
135
// Unexported methods
106
136
//----------------------------------------------------------------------------------------------------------------------
107
137
138
+ func (p * Parser ) parse () error {
139
+ p .setFileSize ()
140
+ err := p .validateDicom ()
141
+ if err != nil {
142
+ return err
143
+ }
144
+ err = p .parseMetadata ()
145
+ if err != nil {
146
+ return err
147
+ }
148
+ if p .skipDataset {
149
+ return nil
150
+ }
151
+ err = p .parseDataset ()
152
+ if err != nil {
153
+ return err
154
+ }
155
+ return nil
156
+ }
157
+
108
158
// setFileSize sets the file size to the reader
109
159
func (p * Parser ) setFileSize () {
110
160
_ = p .reader .SetFileSize (p .fileSize )
0 commit comments