// 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 }