toml: easier scanner configuration (#12016)

pull/12007/head
Larpon 2021-09-29 13:53:06 +02:00 committed by GitHub
parent f2c710d306
commit 4ff061927b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 13 deletions

View File

@ -3,6 +3,8 @@
// that can be found in the LICENSE file. // that can be found in the LICENSE file.
module input module input
import os
// Config is used to configure input to the toml module. // Config is used to configure input to the toml module.
// Only one of the fields `text` and `file_path` is allowed to be set at time of configuration. // Only one of the fields `text` and `file_path` is allowed to be set at time of configuration.
pub struct Config { pub struct Config {
@ -11,6 +13,23 @@ pub:
file_path string // '/path/to/file.toml' file_path string // '/path/to/file.toml'
} }
// auto_config returns an, automatic determined, input Config based on heuristics
// found in `toml`
pub fn auto_config(toml string) ?Config {
mut config := Config{}
if !toml.contains('\n') && os.is_file(toml) {
config = Config{
file_path: toml
}
} else {
config = Config{
text: toml
}
}
config.validate() ?
return config
}
// validate returns an optional error if more than one of the fields // validate returns an optional error if more than one of the fields
// in `Config` has a non-default value (empty string). // in `Config` has a non-default value (empty string).
pub fn (c Config) validate() ? { pub fn (c Config) validate() ? {
@ -22,3 +41,14 @@ pub fn (c Config) validate() ? {
' ${typeof(c).name} must either contain a valid `file_path` OR a non-empty `text` field') ' ${typeof(c).name} must either contain a valid `file_path` OR a non-empty `text` field')
} }
} }
pub fn (c Config) read_input() ?string {
mut text := c.text
if os.is_file(c.file_path) {
text = os.read_file(c.file_path) or {
return error(@MOD + '.' + @STRUCT + '.' + @FN +
' Could not read "$c.file_path": "$err.msg"')
}
}
return text
}

View File

@ -38,7 +38,7 @@ pub:
tokenize_formating bool // if true, generate tokens for `\n`, ` `, `\t`, `\r` etc. tokenize_formating bool // if true, generate tokens for `\n`, ` `, `\t`, `\r` etc.
} }
// new_scanner returns a new heap allocated `Scanner` instance. // new_scanner returns a new *heap* allocated `Scanner` instance.
pub fn new_scanner(config Config) ?&Scanner { pub fn new_scanner(config Config) ?&Scanner {
config.input.validate() ? config.input.validate() ?
mut text := config.input.text mut text := config.input.text
@ -56,6 +56,17 @@ pub fn new_scanner(config Config) ?&Scanner {
return s return s
} }
// returns a new *stack* allocated `Scanner` instance.
pub fn new_simple(toml_input string) ?Scanner {
config := Config{
input: input.auto_config(toml_input) ?
}
return Scanner{
config: config
text: config.input.read_input() ?
}
}
// scan returns the next token from the input. // scan returns the next token from the input.
[direct_array_access] [direct_array_access]
pub fn (mut s Scanner) scan() ?token.Token { pub fn (mut s Scanner) scan() ?token.Token {

View File

@ -3,7 +3,6 @@
// that can be found in the LICENSE file. // that can be found in the LICENSE file.
module toml module toml
import os
import toml.ast import toml.ast
import toml.util import toml.util
import toml.input import toml.input
@ -71,17 +70,7 @@ pub fn parse_text(text string) ?Doc {
// parse automatically try to determine if the type of `toml` is a file or text. // parse automatically try to determine if the type of `toml` is a file or text.
// For explicit parsing of input types see `parse_file` or `parse_text`. // For explicit parsing of input types see `parse_file` or `parse_text`.
pub fn parse(toml string) ?Doc { pub fn parse(toml string) ?Doc {
mut input_config := input.Config{} mut input_config := input.auto_config(toml) ?
if !toml.contains('\n') && os.is_file(toml) {
input_config = input.Config{
file_path: toml
}
} else {
input_config = input.Config{
text: toml
}
}
scanner_config := scanner.Config{ scanner_config := scanner.Config{
input: input_config input: input_config
} }