@@ -101,6 +101,7 @@ type ediReader struct {
101
101
target * idr.Node
102
102
targetXPath * xpath.Expr
103
103
runeBegin , runeEnd int
104
+ segCount int
104
105
unprocessedRawSeg rawSeg
105
106
}
106
107
@@ -169,6 +170,7 @@ func runeCountAndHasOnlyCRLF(b []byte) (int, bool) {
169
170
170
171
var (
171
172
crBytes = []byte ("\r " )
173
+ lfBytes = []byte ("\n " )
172
174
)
173
175
174
176
func (r * ediReader ) getUnprocessedRawSeg () (rawSeg , error ) {
@@ -189,6 +191,7 @@ func (r *ediReader) getUnprocessedRawSeg() (rawSeg, error) {
189
191
token = b
190
192
break
191
193
}
194
+ r .segCount ++
192
195
// We are here because:
193
196
// 1. we find next token (i.e. segment), great, let's process it, OR
194
197
// 2. r.scanner.Scan() returns false and it's EOF (note scanner never returns EOF, it just returns false
@@ -259,14 +262,16 @@ func (r *ediReader) rawSegToNode(segDecl *segDecl) (*idr.Node, error) {
259
262
break
260
263
}
261
264
}
262
- if rawElemIndex < len (rawElems ) || elemDecl .EmptyIfMissing {
265
+ if rawElemIndex < len (rawElems ) || elemDecl .EmptyIfMissing || elemDecl . Default != nil {
263
266
elemN := idr .CreateNode (idr .ElementNode , elemDecl .Name )
264
267
idr .AddChild (n , elemN )
265
268
data := ""
266
269
if rawElemIndex < len (rawElems ) {
267
270
data = string (strs .ByteUnescape (rawElems [rawElemIndex ].data , r .releaseChar .b , true ))
268
271
rawElems [rawElemIndex ].dateUnescaped = true
269
272
rawElemIndex ++
273
+ } else if elemDecl .Default != nil {
274
+ data = * elemDecl .Default
270
275
}
271
276
elemV := idr .CreateNode (idr .TextNode , data )
272
277
idr .AddChild (elemN , elemV )
@@ -325,7 +330,7 @@ func (r *ediReader) segNext() error {
325
330
// 'end' to 'begin' to make the error msg less confusing.
326
331
r .runeBegin = r .runeEnd
327
332
return ErrInvalidEDI (r .fmtErrStr ("segment '%s' needs min occur %d, but only got %d" ,
328
- cur .segDecl .Name , cur .segDecl .minOccurs (), cur .occurred ))
333
+ strs . FirstNonBlank ( cur .segDecl .fqdn , cur . segDecl . Name ) , cur .segDecl .minOccurs (), cur .occurred ))
329
334
}
330
335
if len (r .stack ) <= 1 {
331
336
return nil
@@ -420,8 +425,8 @@ func (r *ediReader) FmtErr(format string, args ...interface{}) error {
420
425
}
421
426
422
427
func (r * ediReader ) fmtErrStr (format string , args ... interface {}) string {
423
- return fmt .Sprintf ("input '%s' between character [%d,%d]: %s" ,
424
- r .inputName , r .runeBegin , r .runeEnd , fmt .Sprintf (format , args ... ))
428
+ return fmt .Sprintf ("input '%s' at segment no.%d (char [%d,%d]) : %s" ,
429
+ r .inputName , r .segCount , r . runeBegin , r .runeEnd , fmt .Sprintf (format , args ... ))
425
430
}
426
431
427
432
const (
@@ -442,6 +447,10 @@ func NewReader(inputName string, r io.Reader, decl *fileDecl, targetXPath string
442
447
elemDelim := newStrPtrByte (& decl .ElemDelim )
443
448
compDelim := newStrPtrByte (decl .CompDelim )
444
449
releaseChar := newStrPtrByte (decl .ReleaseChar )
450
+ if decl .IgnoreCRLF {
451
+ r = ios .NewBytesReplacingReader (r , crBytes , nil )
452
+ r = ios .NewBytesReplacingReader (r , lfBytes , nil )
453
+ }
445
454
scanner := ios .NewScannerByDelim3 (r , segDelim .b , releaseChar .b , scannerFlags , make ([]byte , ReaderBufSize ))
446
455
targetXPathExpr , err := func () (* xpath.Expr , error ) {
447
456
if targetXPath == "" || targetXPath == "." {
@@ -463,6 +472,7 @@ func NewReader(inputName string, r io.Reader, decl *fileDecl, targetXPath string
463
472
targetXPath : targetXPathExpr ,
464
473
runeBegin : 1 ,
465
474
runeEnd : 1 ,
475
+ segCount : 0 ,
466
476
unprocessedRawSeg : newRawSeg (),
467
477
}
468
478
reader .growStack (stackEntry {
0 commit comments