62 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			V
		
	
	
| // Copyright (c) 2021 Lars Pontoppidan. All rights reserved.
 | |
| // Use of this source code is governed by an MIT license
 | |
| // that can be found in the LICENSE file.
 | |
| module input
 | |
| 
 | |
| import os
 | |
| 
 | |
| // 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.
 | |
| pub struct Config {
 | |
| pub:
 | |
| 	text      string // TOML text
 | |
| 	file_path string // '/path/to/file.toml'
 | |
| }
 | |
| 
 | |
| // auto_config returns an, automatic determined, input Config based on heuristics
 | |
| // found in `toml`
 | |
| // One example of several of why it's deprecated:
 | |
| // https://discord.com/channels/592103645835821068/592114487759470596/954101934988615721
 | |
| [deprecated: 'will be removed and not replaced due to flaky heuristics that leads to hard to find bugs']
 | |
| [deprecated_after: '2022-06-18']
 | |
| 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
 | |
| // in `Config` has a non-default value (empty string).
 | |
| fn (c Config) validate() ? {
 | |
| 	if c.file_path != '' && c.text != '' {
 | |
| 		error(@MOD + '.' + @FN +
 | |
| 			' ${typeof(c).name} should contain only one of the fields `file_path` OR `text` filled out')
 | |
| 	} else if c.file_path == '' && c.text == '' {
 | |
| 		error(@MOD + '.' + @FN +
 | |
| 			' ${typeof(c).name} must either contain a valid `file_path` OR a non-empty `text` field')
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // read_input returns either Config.text or the read file contents of Config.file_path
 | |
| // depending on which one is not empty.
 | |
| pub fn (c Config) read_input() ?string {
 | |
| 	c.validate()?
 | |
| 	mut text := c.text
 | |
| 	if text == '' && 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
 | |
| }
 |