Commit() method implemented
This commit is contained in:
		| @ -1,7 +1,7 @@ | |||||||
| package bufr | package bufr | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"git.tordarus.net/Tordarus/adverr" | 	"git.milar.in/milarin/adverr" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								go.mod
									
									
									
									
									
								
							| @ -1,8 +1,8 @@ | |||||||
| module git.tordarus.net/Tordarus/bufr | module git.milar.in/milarin/bufr | ||||||
|  |  | ||||||
| go 1.18 | go 1.19 | ||||||
|  |  | ||||||
| require ( | require ( | ||||||
| 	git.tordarus.net/Tordarus/adverr v0.2.0 | 	git.milar.in/milarin/adverr v1.1.0 | ||||||
| 	git.tordarus.net/Tordarus/dstruct v0.0.2 | 	git.milar.in/milarin/ds v0.0.2 | ||||||
| ) | ) | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								go.sum
									
									
									
									
									
								
							| @ -1,4 +1,8 @@ | |||||||
| git.tordarus.net/Tordarus/adverr v0.2.0 h1:kLYjR2/Vb2GHiSAMvAv+WPNaHR9BRphKanf8H/pCZdA= | git.milar.in/milarin/adverr v1.1.0 h1:jD9WnOvs40lfMhvqQ7cllOaRJNBMWr1f07/s9jAadp0= | ||||||
| git.tordarus.net/Tordarus/adverr v0.2.0/go.mod h1:XRf0+7nhOkIEr0gi9DUG4RvV2KaOFB0fYPDaR1KLenw= | git.milar.in/milarin/adverr v1.1.0/go.mod h1:joU9sBb7ySyNv4SpTXB0Z4o1mjXsArBw4N27wjgzj9E= | ||||||
| git.tordarus.net/Tordarus/dstruct v0.0.2 h1:oFaZO7YXQeHjxL4DmMaZ+Eb4MvP23dX8GAXs0Z6VQKo= | git.milar.in/milarin/ds v0.0.0-20230120204927-7dc44b9cd222 h1:r7gcMqltPqk9U2/+LzEN5dooZ5wiQ8C7SI/nK6T0KjA= | ||||||
| git.tordarus.net/Tordarus/dstruct v0.0.2/go.mod h1:RvLL2G4lUCGzwr8KaBGQRi3qlMG0WTgGhcVN6iyZZuw= | git.milar.in/milarin/ds v0.0.0-20230120204927-7dc44b9cd222/go.mod h1:HJK7QERcRvV9j7xzEocrKUtW+1q4JB1Ly4Bj54chfwI= | ||||||
|  | git.milar.in/milarin/ds v0.0.1 h1:ov4Rp+QiB3xtmV0a4eC+LluxWEOvbykgW+wCchYEp9o= | ||||||
|  | git.milar.in/milarin/ds v0.0.1/go.mod h1:HJK7QERcRvV9j7xzEocrKUtW+1q4JB1Ly4Bj54chfwI= | ||||||
|  | git.milar.in/milarin/ds v0.0.2 h1:vCA3mDxZUNfvHpzrdz7SeBUKiPn74NTopo915IUG7I0= | ||||||
|  | git.milar.in/milarin/ds v0.0.2/go.mod h1:HJK7QERcRvV9j7xzEocrKUtW+1q4JB1Ly4Bj54chfwI= | ||||||
|  | |||||||
							
								
								
									
										55
									
								
								reader.go
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								reader.go
									
									
									
									
									
								
							| @ -5,18 +5,18 @@ import ( | |||||||
| 	"io" | 	"io" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"git.tordarus.net/Tordarus/dstruct" | 	"git.milar.in/milarin/ds" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type Reader struct { | type Reader struct { | ||||||
| 	buf *dstruct.Stack[posRune] | 	buf ds.Stack[posRune] | ||||||
| 	src *bufio.Reader | 	src *bufio.Reader | ||||||
| 	pos *Position | 	pos *Position | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewReader(r io.Reader) *Reader { | func NewReader(r io.Reader) *Reader { | ||||||
| 	return &Reader{ | 	return &Reader{ | ||||||
| 		buf: new(dstruct.Stack[posRune]), | 		buf: ds.NewArrayStack[posRune](), | ||||||
| 		src: bufio.NewReader(r), | 		src: bufio.NewReader(r), | ||||||
| 		pos: &Position{}, | 		pos: &Position{}, | ||||||
| 	} | 	} | ||||||
| @ -43,6 +43,21 @@ func (r *Reader) Rune() (rune, error) { | |||||||
| 	return rn, err | 	return rn, err | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // PeekRune returns the next rune in r without advancing reader position. | ||||||
|  | // The next read will return the same rune again. | ||||||
|  | func (r *Reader) PeekRune() (rune, error) { | ||||||
|  | 	rn, err := r.Rune() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := r.UnreadRune(); err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return rn, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // UnreadRune unreads the last rune. | // UnreadRune unreads the last rune. | ||||||
| // The next read will include the unread rune. | // The next read will include the unread rune. | ||||||
| // It returns ErrNothingToUnread if there wasn't any read yet | // It returns ErrNothingToUnread if there wasn't any read yet | ||||||
| @ -93,7 +108,41 @@ func (r *Reader) StringWhile(f func(rn rune) bool) (string, error) { | |||||||
| 	return s.String(), err | 	return s.String(), err | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // PeekStringWhile acts as StringWhile but does not advance reader position | ||||||
|  | func (r *Reader) PeekStringWhile(f func(rn rune) bool) (string, error) { | ||||||
|  | 	str, err := r.StringWhile(f) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := r.UnreadString(str); err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return str, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // StringUntil is a shorthand for r.StringWhile(func(rn rune) bool { return !f(rn) }) | // StringUntil is a shorthand for r.StringWhile(func(rn rune) bool { return !f(rn) }) | ||||||
| func (r *Reader) StringUntil(f func(rn rune) bool) (string, error) { | func (r *Reader) StringUntil(f func(rn rune) bool) (string, error) { | ||||||
| 	return r.StringWhile(func(rn rune) bool { return !f(rn) }) | 	return r.StringWhile(func(rn rune) bool { return !f(rn) }) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // PeekStringUntil acts as StringUntil but does not advance reader position | ||||||
|  | func (r *Reader) PeekStringUntil(f func(rn rune) bool) (string, error) { | ||||||
|  | 	str, err := r.StringUntil(f) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := r.UnreadString(str); err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return str, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Commit clears the internal buffer and therefore removes all data which were already read. | ||||||
|  | // After calling Commit any unreads will return ErrNothingToUnread until another read occured. | ||||||
|  | func (r *Reader) Commit() { | ||||||
|  | 	r.buf.Clear() | ||||||
|  | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 milarin
					milarin