1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
package swift
import (
"fmt"
"github.com/mitch000001/go-hbci/token"
)
// NewMessageExtractor returns a message extractor feasable extracting
// S.W.I.F.T. messages from the given input
func NewMessageExtractor(swiftMessage []byte) *MessageExtractor {
lexer := token.NewSwiftLexer("MessageExtractor", swiftMessage)
return &MessageExtractor{
lexer: lexer,
rawSwiftMessage: swiftMessage,
}
}
// MessageExtractor represents an extractor for S.W.I.F.T. messages
type MessageExtractor struct {
lexer *token.SwiftLexer
rawSwiftMessage []byte
extractedMessages [][]byte
}
// Extract extracts raw S.W.I.F.T. messages from the given input
func (m *MessageExtractor) Extract() ([][]byte, error) {
var current []byte
for m.lexer.HasNext() {
tok := m.lexer.Next()
if tok.Type() == token.ERROR {
return nil, &SyntaxError{Token: tok, RawMessage: m.rawSwiftMessage}
}
current = append(current, tok.Value()...)
if tok.Type() == token.SWIFT_MESSAGE_SEPARATOR {
m.extractedMessages = append(m.extractedMessages, current)
current = []byte{}
}
}
result := make([][]byte, len(m.extractedMessages))
copy(result, m.extractedMessages)
return result, nil
}
type SyntaxError struct {
Token token.Token
RawMessage []byte
}
func (s *SyntaxError) Error() string {
return fmt.Sprintf("syntax error at position %d: %q\n(%q)", s.Token.Pos(), s.Token.Value(), s.RawMessage)
}
func (s SyntaxError) IsUnexpectedEndOfInput() bool {
return token.IsUnexpectedEndOfInput(s.Token)
}
|