From 7f2210dbcab017ee30e8f95771e68494b4860c59 Mon Sep 17 00:00:00 2001 From: sigoden Date: Wed, 1 Nov 2023 10:28:54 +0800 Subject: refactor: clients/* and config.rs (#193) - add register_clients macro to make it easier to add a new client - no create_client_config, just add const PROMPTS - move ModelInfo from clients/ to config/ - model's max_tokens are optional - improve code quanity on config/mod.rs - add/use macro config_get_fn --- src/utils/prompt_input.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/utils/prompt_input.rs (limited to 'src/utils/prompt_input.rs') diff --git a/src/utils/prompt_input.rs b/src/utils/prompt_input.rs new file mode 100644 index 0000000..f63823a --- /dev/null +++ b/src/utils/prompt_input.rs @@ -0,0 +1,58 @@ +use inquire::{required, validator::Validation, Text}; + +const MSG_REQUIRED: &str = "This field is required"; +const MSG_OPTIONAL: &str = "Optional field - Press ↵ to skip"; + +pub fn prompt_input_string(desc: &str, required: bool) -> anyhow::Result { + let mut text = Text::new(desc); + if required { + text = text.with_validator(required!(MSG_REQUIRED)) + } else { + text = text.with_help_message(MSG_OPTIONAL) + } + text.prompt().map_err(prompt_op_err) +} + +pub fn prompt_input_integer(desc: &str, required: bool) -> anyhow::Result { + let mut text = Text::new(desc); + if required { + text = text.with_validator(|text: &str| { + let out = if text.is_empty() { + Validation::Invalid(MSG_REQUIRED.into()) + } else { + validate_integer(text) + }; + Ok(out) + }) + } else { + text = text + .with_validator(|text: &str| { + let out = if text.is_empty() { + Validation::Valid + } else { + validate_integer(text) + }; + Ok(out) + }) + .with_help_message(MSG_OPTIONAL) + } + text.prompt().map_err(prompt_op_err) +} + +pub fn prompt_op_err(_: T) -> anyhow::Error { + anyhow::anyhow!("Not finish questionnaire, try again later!") +} + +#[derive(Debug, Clone, Copy)] +pub enum PromptKind { + String, + Integer, +} + +fn validate_integer(text: &str) -> Validation { + if text.parse::().is_err() { + Validation::Invalid("Must be a integer".into()) + } else { + Validation::Valid + } +} -- cgit v1.2.3