Tidy up parsing API
This commit is contained in:
		
							parent
							
								
									7b7ad2e791
								
							
						
					
					
						commit
						7cd6ac1c51
					
				
							
								
								
									
										17
									
								
								ini.go
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								ini.go
									
									
									
									
									
								
							| @ -18,10 +18,17 @@ func (parser *Parser) Err() error { | |||||||
| 	return parser.err | 	return parser.err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Returns `true` if `parser` has reached the end of parsable tokens, either because the stream has | ||||||
|  | // ended or it has encountered an error. | ||||||
|  | func (parser *Parser) IsEnd() bool { | ||||||
|  | 	return parser.isEnd | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Creates and returns a new [Parser] by reference from `reader` | // Creates and returns a new [Parser] by reference from `reader` | ||||||
| func NewParser(reader io.Reader) *Parser { | func NewParser(reader io.Reader) *Parser { | ||||||
| 	return &Parser{ | 	return &Parser{ | ||||||
| 		scanner: bufio.NewScanner(reader), | 		scanner: bufio.NewScanner(reader), | ||||||
|  | 		isEnd:   false, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -31,7 +38,7 @@ func NewParser(reader io.Reader) *Parser { | |||||||
| // | // | ||||||
| // Note that the `parser` does not guarantee any parse order for key-value pairs extracted from the | // Note that the `parser` does not guarantee any parse order for key-value pairs extracted from the | ||||||
| // `parser` stream. | // `parser` stream. | ||||||
| func (parser *Parser) Parse() (Entry, bool) { | func (parser *Parser) Parse() Entry { | ||||||
| 	for parser.scanner.Scan() { | 	for parser.scanner.Scan() { | ||||||
| 		var line = strings.TrimSpace(parser.scanner.Text()) | 		var line = strings.TrimSpace(parser.scanner.Text()) | ||||||
| 		var lineLen = len(line) | 		var lineLen = len(line) | ||||||
| @ -72,7 +79,7 @@ func (parser *Parser) Parse() (Entry, bool) { | |||||||
| 				Section: parser.section, | 				Section: parser.section, | ||||||
| 				Key:     strings.TrimSpace(line[0:assignmentIndex]), | 				Key:     strings.TrimSpace(line[0:assignmentIndex]), | ||||||
| 				Value:   value, | 				Value:   value, | ||||||
| 			}, true | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// Key which is its own value. | 		// Key which is its own value. | ||||||
| @ -82,12 +89,13 @@ func (parser *Parser) Parse() (Entry, bool) { | |||||||
| 			Section: parser.section, | 			Section: parser.section, | ||||||
| 			Key:     keyValue, | 			Key:     keyValue, | ||||||
| 			Value:   keyValue, | 			Value:   keyValue, | ||||||
| 		}, true | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	parser.err = parser.scanner.Err() | 	parser.err = parser.scanner.Err() | ||||||
|  | 	parser.isEnd = true | ||||||
| 
 | 
 | ||||||
| 	return Entry{}, false | 	return Entry{} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // State machine for parsing streamable INI file sources. | // State machine for parsing streamable INI file sources. | ||||||
| @ -95,4 +103,5 @@ type Parser struct { | |||||||
| 	scanner *bufio.Scanner | 	scanner *bufio.Scanner | ||||||
| 	err     error | 	err     error | ||||||
| 	section string | 	section string | ||||||
|  | 	isEnd   bool | ||||||
| } | } | ||||||
|  | |||||||
| @ -3,9 +3,9 @@ | |||||||
| Unsatisfied with the INI parsing tools provided by third-parties in the Golang ecosystem, INI Gusher aims to solve parsing and saving of INI files as simply as possible. | Unsatisfied with the INI parsing tools provided by third-parties in the Golang ecosystem, INI Gusher aims to solve parsing and saving of INI files as simply as possible. | ||||||
| 
 | 
 | ||||||
| ```go | ```go | ||||||
| var iniParser = ini.NewParser(modInfoFile) | var parser = ini.NewParser(modInfoFile) | ||||||
| 
 | 
 | ||||||
| for entry, parsed := iniParser.Parse(); parsed; entry, parsed = iniParser.Parse() { | for entry, parsed := parser.Parse(); parsed; entry, parsed = parser.Parse() { | ||||||
|     var myValue = myValueMap[entry.Section] |     var myValue = myValueMap[entry.Section] | ||||||
| 
 | 
 | ||||||
|     switch entry.Key { |     switch entry.Key { | ||||||
| @ -22,7 +22,7 @@ for entry, parsed := iniParser.Parse(); parsed; entry, parsed = iniParser.Parse( | |||||||
|     myValueMap[entry.Section] = myValue |     myValueMap[entry.Section] = myValue | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| if err := iniParser.Err(); err != nil { | if err := parser.Err(); err != nil { | ||||||
|     return err |     return err | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
| @ -39,6 +39,7 @@ As with Golang itself, INI Gusher is fairly opinionated; The API uses incrementa | |||||||
|   * Unquoted keys may only use alphanumerics of any case. |   * Unquoted keys may only use alphanumerics of any case. | ||||||
|   * Unquoted values may only use alphanumerics of any case and whitespace is only acknowledged if it is between them. |   * Unquoted values may only use alphanumerics of any case and whitespace is only acknowledged if it is between them. | ||||||
|   * Keys and values may be surrounded in double-quotes (`"`) to preseve trailing whitespace and allow all characters. |   * Keys and values may be surrounded in double-quotes (`"`) to preseve trailing whitespace and allow all characters. | ||||||
|  |   * Sections allow all characters between their opening and closing braces (`"[]"`). | ||||||
|   * Whitespace is ignored everywhere else. |   * Whitespace is ignored everywhere else. | ||||||
|   * The default section is an empty string (`""`). |   * The default section is an empty string (`""`). | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user