8 "github.com/Sirupsen/logrus"
11 var logger *logrus.Logger
13 type AnsiParser struct {
15 eventHandler AnsiEventHandler
21 escapeIntermediate state
28 func CreateParser(initialState string, evtHandler AnsiEventHandler) *AnsiParser {
29 logFile := ioutil.Discard
31 if isDebugEnv := os.Getenv(LogEnv); isDebugEnv == "1" {
32 logFile, _ = os.Create("ansiParser.log")
35 logger = &logrus.Logger{
37 Formatter: new(logrus.TextFormatter),
38 Level: logrus.InfoLevel,
41 parser := &AnsiParser{
42 eventHandler: evtHandler,
43 context: &ansiContext{},
46 parser.csiEntry = csiEntryState{baseState{name: "CsiEntry", parser: parser}}
47 parser.csiParam = csiParamState{baseState{name: "CsiParam", parser: parser}}
48 parser.dcsEntry = dcsEntryState{baseState{name: "DcsEntry", parser: parser}}
49 parser.escape = escapeState{baseState{name: "Escape", parser: parser}}
50 parser.escapeIntermediate = escapeIntermediateState{baseState{name: "EscapeIntermediate", parser: parser}}
51 parser.error = errorState{baseState{name: "Error", parser: parser}}
52 parser.ground = groundState{baseState{name: "Ground", parser: parser}}
53 parser.oscString = oscStringState{baseState{name: "OscString", parser: parser}}
55 parser.stateMap = []state{
60 parser.escapeIntermediate,
66 parser.currState = getState(initialState, parser.stateMap)
68 logger.Infof("CreateParser: parser %p", parser)
72 func getState(name string, states []state) state {
73 for _, el := range states {
74 if el.Name() == name {
82 func (ap *AnsiParser) Parse(bytes []byte) (int, error) {
83 for i, b := range bytes {
84 if err := ap.handle(b); err != nil {
89 return len(bytes), ap.eventHandler.Flush()
92 func (ap *AnsiParser) handle(b byte) error {
93 ap.context.currentChar = b
94 newState, err := ap.currState.Handle(b)
100 logger.Warning("newState is nil")
101 return errors.New("New state of 'nil' is invalid.")
104 if newState != ap.currState {
105 if err := ap.changeState(newState); err != nil {
113 func (ap *AnsiParser) changeState(newState state) error {
114 logger.Infof("ChangeState %s --> %s", ap.currState.Name(), newState.Name())
117 if err := ap.currState.Exit(); err != nil {
118 logger.Infof("Exit state '%s' failed with : '%v'", ap.currState.Name(), err)
122 // Perform transition action
123 if err := ap.currState.Transition(newState); err != nil {
124 logger.Infof("Transition from '%s' to '%s' failed with: '%v'", ap.currState.Name(), newState.Name, err)
129 if err := newState.Enter(); err != nil {
130 logger.Infof("Enter state '%s' failed with: '%v'", newState.Name(), err)
134 ap.currState = newState