moved Line into line.go | remove unused fields (Number, Indent)
This commit is contained in:
parent
14f68cbf8e
commit
73b953c35b
|
@ -54,7 +54,7 @@ func (d *decoder) Decode(v interface{}) error {
|
||||||
for {
|
for {
|
||||||
n++
|
n++
|
||||||
|
|
||||||
l := &Line{Number: n, Type: NONE}
|
l := &Line{Type: NONE}
|
||||||
|
|
||||||
// 1. read line
|
// 1. read line
|
||||||
notrim, err := r.ReadString('\n')
|
notrim, err := r.ReadString('\n')
|
||||||
|
@ -71,13 +71,7 @@ func (d *decoder) Decode(v interface{}) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. get indentation
|
// 2. comment
|
||||||
var firstChar int
|
|
||||||
for firstChar = 0; inArray(" \t", notrim[firstChar]); firstChar++ {
|
|
||||||
}
|
|
||||||
l.Indent = notrim[0:firstChar]
|
|
||||||
|
|
||||||
// 3. comment
|
|
||||||
if line[0] == '#' {
|
if line[0] == '#' {
|
||||||
l.Type = COMMENT
|
l.Type = COMMENT
|
||||||
l.Components = []string{strings.Trim(line[1:], " \t")}
|
l.Components = []string{strings.Trim(line[1:], " \t")}
|
||||||
|
@ -91,7 +85,7 @@ func (d *decoder) Decode(v interface{}) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. section
|
// 3. section
|
||||||
if l.Type == NONE {
|
if l.Type == NONE {
|
||||||
match := reSection.FindStringSubmatch(line)
|
match := reSection.FindStringSubmatch(line)
|
||||||
if match != nil {
|
if match != nil {
|
||||||
|
@ -102,7 +96,7 @@ func (d *decoder) Decode(v interface{}) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. include
|
// 4. include
|
||||||
if l.Type == NONE {
|
if l.Type == NONE {
|
||||||
match := reInclude.FindStringSubmatch(line)
|
match := reInclude.FindStringSubmatch(line)
|
||||||
if match != nil {
|
if match != nil {
|
||||||
|
@ -111,7 +105,7 @@ func (d *decoder) Decode(v interface{}) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6. assignment
|
// 5. assignment
|
||||||
if l.Type == NONE {
|
if l.Type == NONE {
|
||||||
match := reAssign.FindStringSubmatch(line)
|
match := reAssign.FindStringSubmatch(line)
|
||||||
if match != nil {
|
if match != nil {
|
||||||
|
@ -120,12 +114,12 @@ func (d *decoder) Decode(v interface{}) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 7. invalid type
|
// 6. invalid type
|
||||||
if l.Type == NONE {
|
if l.Type == NONE {
|
||||||
return &LineError{n, ErrInvalidSyntax}
|
return &LineError{n, ErrInvalidSyntax}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 8. pop section
|
// 7. pop section
|
||||||
if l.Type == SECTIONEND {
|
if l.Type == SECTIONEND {
|
||||||
cur := stack[len(stack)-1] // pop
|
cur := stack[len(stack)-1] // pop
|
||||||
stack = stack[0 : len(stack)-1] // pop
|
stack = stack[0 : len(stack)-1] // pop
|
||||||
|
@ -141,7 +135,7 @@ func (d *decoder) Decode(v interface{}) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// 9. add to section / or receiver
|
// 8. add to section / or receiver
|
||||||
stacklen := len(stack)
|
stacklen := len(stack)
|
||||||
if stacklen > 0 && l.Type == SECTION {
|
if stacklen > 0 && l.Type == SECTION {
|
||||||
stacklen--
|
stacklen--
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
package nginx
|
||||||
|
|
||||||
|
// LineType enumerates available line types
|
||||||
|
type LineType byte
|
||||||
|
|
||||||
|
const (
|
||||||
|
// NONE is the default line type (invalid syntax)
|
||||||
|
NONE LineType = iota
|
||||||
|
// COMMENT represents a #-comment
|
||||||
|
COMMENT
|
||||||
|
// COLONCOMMENT represents a ;-comment
|
||||||
|
COLONCOMMENT
|
||||||
|
// ASSIGNMENT line
|
||||||
|
ASSIGNMENT
|
||||||
|
// INCLUDE line
|
||||||
|
INCLUDE
|
||||||
|
// SECTION start
|
||||||
|
SECTION
|
||||||
|
// SECTIONEND line '}'
|
||||||
|
SECTIONEND
|
||||||
|
)
|
||||||
|
|
||||||
|
// Line represents a meaningful line
|
||||||
|
type Line struct {
|
||||||
|
// Type of line
|
||||||
|
Type LineType
|
||||||
|
|
||||||
|
// Components of the line
|
||||||
|
Components []string
|
||||||
|
|
||||||
|
// Lines children of the current section (nil if not a section)
|
||||||
|
Lines []*Line
|
||||||
|
}
|
||||||
|
|
||||||
|
// Section returns the section with a given name *directly*
|
||||||
|
// inside the current line ; nil is returned if no match found
|
||||||
|
func (l *Line) Section(name string) *Line {
|
||||||
|
for _, elem := range l.Lines {
|
||||||
|
if elem.Type == SECTION && elem.Components[0] == name {
|
||||||
|
return elem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns a pointer to the assignment line the given name as key
|
||||||
|
// *directly* inside the current line ; nil is returned if no match found
|
||||||
|
func (l *Line) Get(name string) *Line {
|
||||||
|
for _, elem := range l.Lines {
|
||||||
|
if elem.Type == ASSIGNMENT && elem.Components[0] == name {
|
||||||
|
return elem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -4,49 +4,6 @@ import (
|
||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LineType enumerates available line types
|
|
||||||
type LineType byte
|
|
||||||
|
|
||||||
const (
|
|
||||||
// NONE is the default line type (invalid syntax)
|
|
||||||
NONE LineType = iota
|
|
||||||
// COMMENT represents a #-comment
|
|
||||||
COMMENT
|
|
||||||
// COLONCOMMENT represents a ;-comment
|
|
||||||
COLONCOMMENT
|
|
||||||
// ASSIGNMENT line
|
|
||||||
ASSIGNMENT
|
|
||||||
// INCLUDE line
|
|
||||||
INCLUDE
|
|
||||||
// SECTION start
|
|
||||||
SECTION
|
|
||||||
// SECTIONEND line '}'
|
|
||||||
SECTIONEND
|
|
||||||
)
|
|
||||||
|
|
||||||
// Line represents a meaningful line
|
|
||||||
type Line struct {
|
|
||||||
// Number of the line in the input file
|
|
||||||
Number int
|
|
||||||
|
|
||||||
// Type of line
|
|
||||||
Type LineType
|
|
||||||
|
|
||||||
// Path is the absolute dot-separated path to this line
|
|
||||||
// "" | at the root of the file
|
|
||||||
// "a.b" | inside the 'a' section inside the 'a' section
|
|
||||||
Path string
|
|
||||||
|
|
||||||
// Components of the line
|
|
||||||
Components []string
|
|
||||||
|
|
||||||
// Lines children of the current section (nil if not a section)
|
|
||||||
Lines []*Line
|
|
||||||
|
|
||||||
// Indent is the indentation characters
|
|
||||||
Indent string
|
|
||||||
}
|
|
||||||
|
|
||||||
type nginx struct {
|
type nginx struct {
|
||||||
Lines []*Line
|
Lines []*Line
|
||||||
}
|
}
|
||||||
|
@ -55,3 +12,25 @@ type nginx struct {
|
||||||
func (n *nginx) NewDecoder(r io.Reader) *decoder {
|
func (n *nginx) NewDecoder(r io.Reader) *decoder {
|
||||||
return &decoder{reader: r}
|
return &decoder{reader: r}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Section returns the section with a given name at the root level
|
||||||
|
// nil is returned if no match found
|
||||||
|
func (l *nginx) Section(name string) *Line {
|
||||||
|
for _, elem := range l.Lines {
|
||||||
|
if elem.Type == SECTION && elem.Components[0] == name {
|
||||||
|
return elem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns a pointer to the assignment line the given name as key
|
||||||
|
// at the root level
|
||||||
|
func (l *nginx) Get(name string) *Line {
|
||||||
|
for _, elem := range l.Lines {
|
||||||
|
if elem.Type == ASSIGNMENT && elem.Components[0] == name {
|
||||||
|
return elem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue