mirror of
				https://github.com/TeaOSLab/EdgeCommon.git
				synced 2025-11-04 05:00:24 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
						|
 | 
						|
package iplibrary
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"errors"
 | 
						|
)
 | 
						|
 | 
						|
type Parser struct {
 | 
						|
	config *ParserConfig
 | 
						|
 | 
						|
	data []byte
 | 
						|
}
 | 
						|
 | 
						|
func NewParser(config *ParserConfig) (*Parser, error) {
 | 
						|
	if config == nil {
 | 
						|
		config = &ParserConfig{}
 | 
						|
	}
 | 
						|
 | 
						|
	if config.Template == nil {
 | 
						|
		return nil, errors.New("template must not be nil")
 | 
						|
	}
 | 
						|
 | 
						|
	return &Parser{
 | 
						|
		config: config,
 | 
						|
	}, nil
 | 
						|
}
 | 
						|
 | 
						|
func (this *Parser) Write(data []byte) {
 | 
						|
	this.data = append(this.data, data...)
 | 
						|
}
 | 
						|
 | 
						|
func (this *Parser) Parse() error {
 | 
						|
	if len(this.data) == 0 {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
	for {
 | 
						|
		var index = bytes.IndexByte(this.data, '\n')
 | 
						|
		if index >= 0 {
 | 
						|
			var line = this.data[:index+1]
 | 
						|
			values, found := this.config.Template.Extract(string(line), this.config.EmptyValues)
 | 
						|
			if found {
 | 
						|
				if this.config.Iterator != nil {
 | 
						|
					err := this.config.Iterator(values)
 | 
						|
					if err != nil {
 | 
						|
						return err
 | 
						|
					}
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				// 防止错误信息太长
 | 
						|
				if len(line) > 256 {
 | 
						|
					line = line[:256]
 | 
						|
				}
 | 
						|
				return errors.New("invalid line '" + string(line) + "'")
 | 
						|
			}
 | 
						|
 | 
						|
			this.data = this.data[index+1:]
 | 
						|
		} else {
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 |