From 73b953c35b71821c59a8bd69014581ce16ecd68a Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Mon, 12 Nov 2018 15:35:45 +0100 Subject: [PATCH] moved Line into line.go | remove unused fields (Number, Indent) --- internal/cnf/parser/nginx/decoder.go | 22 ++++------ internal/cnf/parser/nginx/line.go | 55 +++++++++++++++++++++++ internal/cnf/parser/nginx/nginx.go | 65 ++++++++++------------------ 3 files changed, 85 insertions(+), 57 deletions(-) create mode 100644 internal/cnf/parser/nginx/line.go diff --git a/internal/cnf/parser/nginx/decoder.go b/internal/cnf/parser/nginx/decoder.go index b20c2b5..beb2e31 100644 --- a/internal/cnf/parser/nginx/decoder.go +++ b/internal/cnf/parser/nginx/decoder.go @@ -54,7 +54,7 @@ func (d *decoder) Decode(v interface{}) error { for { n++ - l := &Line{Number: n, Type: NONE} + l := &Line{Type: NONE} // 1. read line notrim, err := r.ReadString('\n') @@ -71,13 +71,7 @@ func (d *decoder) Decode(v interface{}) error { continue } - // 3. get indentation - var firstChar int - for firstChar = 0; inArray(" \t", notrim[firstChar]); firstChar++ { - } - l.Indent = notrim[0:firstChar] - - // 3. comment + // 2. comment if line[0] == '#' { l.Type = COMMENT 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 { match := reSection.FindStringSubmatch(line) if match != nil { @@ -102,7 +96,7 @@ func (d *decoder) Decode(v interface{}) error { } } - // 5. include + // 4. include if l.Type == NONE { match := reInclude.FindStringSubmatch(line) if match != nil { @@ -111,7 +105,7 @@ func (d *decoder) Decode(v interface{}) error { } } - // 6. assignment + // 5. assignment if l.Type == NONE { match := reAssign.FindStringSubmatch(line) if match != nil { @@ -120,12 +114,12 @@ func (d *decoder) Decode(v interface{}) error { } } - // 7. invalid type + // 6. invalid type if l.Type == NONE { return &LineError{n, ErrInvalidSyntax} } - // 8. pop section + // 7. pop section if l.Type == SECTIONEND { cur := stack[len(stack)-1] // pop stack = stack[0 : len(stack)-1] // pop @@ -141,7 +135,7 @@ func (d *decoder) Decode(v interface{}) error { continue } - // 9. add to section / or receiver + // 8. add to section / or receiver stacklen := len(stack) if stacklen > 0 && l.Type == SECTION { stacklen-- diff --git a/internal/cnf/parser/nginx/line.go b/internal/cnf/parser/nginx/line.go new file mode 100644 index 0000000..a05350f --- /dev/null +++ b/internal/cnf/parser/nginx/line.go @@ -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 +} diff --git a/internal/cnf/parser/nginx/nginx.go b/internal/cnf/parser/nginx/nginx.go index fdbb577..38249da 100644 --- a/internal/cnf/parser/nginx/nginx.go +++ b/internal/cnf/parser/nginx/nginx.go @@ -4,49 +4,6 @@ import ( "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 { Lines []*Line } @@ -55,3 +12,25 @@ type nginx struct { func (n *nginx) NewDecoder(r io.Reader) *decoder { 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 +}