diff --git a/Cargo.toml b/Cargo.toml index 0eb36fd..624b1ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,13 +7,15 @@ edition = "2018" [workspace] members = [ ".", - "inquisition-ui" + "inquisition-ui", + "inquisition-macros", ] [dependencies] tempfile = "3" atty = "0.2" ui = { package = "inquisition-ui", path = "./inquisition-ui" } +macros = { package = "inquisition-macros", path = "./inquisition-macros" } ahash = { version = "0.7", optional = true } async-trait = { version = "0.1", optional = true } @@ -26,6 +28,9 @@ smol-dep = { package = "smol", version = "1.2", optional = true } tokio-dep = { package = "tokio", version = "1.5", optional = true, features = ["fs", "process", "io-util"] } async-std-dep = { package = "async-std", version = "1.9", optional = true, features = ["unstable"] } +[dev-dependencies] +trybuild = "1.0.42" + [features] default = ["crossterm", "ahash"] crossterm = ["ui/crossterm"] diff --git a/inquisition-macros/Cargo.toml b/inquisition-macros/Cargo.toml new file mode 100644 index 0000000..f0bdc2d --- /dev/null +++ b/inquisition-macros/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "inquisition-macros" +version = "0.0.1" +authors = ["Lutetium Vanadium"] +edition = "2018" + +[lib] +proc-macro = true + +[dependencies] +proc-macro2 = "1" +syn = { version = "1", features = ["full"] } +quote = "1" +bitflags = "1.2" diff --git a/inquisition-macros/src/helpers.rs b/inquisition-macros/src/helpers.rs new file mode 100644 index 0000000..a702605 --- /dev/null +++ b/inquisition-macros/src/helpers.rs @@ -0,0 +1,204 @@ +use quote::{quote, quote_spanned, ToTokens}; +use syn::{parse::Parse, spanned::Spanned, Token}; + +pub(crate) fn parse_optional_comma( + input: syn::parse::ParseStream, +) -> syn::Result> { + let lookahead = input.lookahead1(); + if !lookahead.peek(Token![,]) { + if input.is_empty() { + return Ok(None); + } else { + return Err(lookahead.error()); + } + } + + Ok(Some(input.parse::()?)) +} + +pub(crate) fn insert_non_dup( + ident: syn::Ident, + item: &mut Option, + input: syn::parse::ParseStream, +) -> syn::Result<()> { + insert_non_dup_parse(ident, item, input, T::parse) +} + +pub(crate) fn insert_non_dup_parse( + ident: syn::Ident, + item: &mut Option, + input: syn::parse::ParseStream, + parser: fn(syn::parse::ParseStream) -> syn::Result, +) -> syn::Result<()> { + match item { + Some(_) => Err(syn::Error::new( + ident.span(), + format!("duplicate option `{}`", ident), + )), + None => { + *item = Some(parser(input)?); + Ok(()) + } + } +} + +#[allow(clippy::large_enum_variant)] +pub(crate) enum Choices { + Array(syn::punctuated::Punctuated), + Expr(syn::Expr), +} + +impl Choices { + fn parse_impl( + input: syn::parse::ParseStream, + parser: fn(syn::parse::ParseStream) -> syn::Result, + ) -> syn::Result { + if input.peek(syn::token::Bracket) { + let content; + syn::bracketed!(content in input); + + Ok(Choices::Array(content.parse_terminated(parser)?)) + } else { + Ok(Choices::Expr(input.parse()?)) + } + } + + pub(crate) fn parse_choice(input: syn::parse::ParseStream) -> syn::Result { + Choices::parse_impl(input, Choice::parse) + } + + pub(crate) fn parse_checkbox_choice( + input: syn::parse::ParseStream, + ) -> syn::Result { + Choices::parse_impl(input, parse_checkbox_choice) + } +} + +impl ToTokens for Choices { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + match self { + Choices::Array(ref elems) => { + let mut choices = proc_macro2::TokenStream::new(); + for elem in elems.iter() { + elem.to_tokens(&mut choices); + choices.extend(quote! { , }) + } + + tokens.extend(quote_spanned! { + elems.span() => ::std::array::IntoIter::new([ #choices ]) + }); + } + Choices::Expr(ref choices) => { + choices.to_tokens(tokens); + } + } + } +} + +pub(crate) enum Choice { + Choice(syn::Expr), + Separator(syn::Expr), + DefaultSeparator, +} + +impl Parse for Choice { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + match input.fork().parse::() { + Ok(i) if i == "sep" || i == "separator" => { + input.parse::()?; + if input.is_empty() || input.peek(Token![,]) { + Ok(Choice::DefaultSeparator) + } else { + Ok(Choice::Separator(input.parse()?)) + } + } + _ => Ok(Choice::Choice(input.parse()?)), + } + } +} + +impl ToTokens for Choice { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + let (ident_name, elem) = match self { + Choice::Choice(elem) => ("Choice", elem), + Choice::Separator(elem) => ("Separator", elem), + Choice::DefaultSeparator => { + tokens.extend(quote! { ::inquisition::DefaultSeparator }); + return; + } + }; + + let ident = syn::Ident::new(ident_name, elem.span()); + + tokens.extend(quote_spanned! { + elem.span() => ::inquisition::#ident( + #[allow(clippy::useless_conversion)] + #elem.into() + ) + }) + } +} + +fn make_into(expr: syn::Expr) -> syn::Expr { + syn::ExprMethodCall { + attrs: Vec::new(), + dot_token: syn::token::Dot(expr.span()), + method: syn::Ident::new("into", expr.span()), + paren_token: syn::token::Paren(expr.span()), + turbofish: None, + args: syn::punctuated::Punctuated::new(), + receiver: Box::new(expr), + } + .into() +} + +// For checkbox, defaults can be given for each option, this method, takes option +// (`choice`), and the default value to put (`default`), and produces the following as +// an `Expr`: +// ``` +// (choice.into(), default.into())` +// ``` +fn make_checkbox_tuple(choice: syn::Expr, default: syn::Expr) -> syn::Expr { + let paren_token = syn::token::Paren( + choice + .span() + .join(default.span()) + .unwrap_or_else(|| choice.span()), + ); + + let mut elems = syn::punctuated::Punctuated::new(); + elems.push_value(make_into(choice)); + elems.push(make_into(default)); + + syn::ExprTuple { + attrs: Vec::new(), + paren_token, + elems, + } + .into() +} + +fn parse_checkbox_choice(input: syn::parse::ParseStream) -> syn::Result { + let choice = input.parse()?; + + let choice = match choice { + Choice::Choice(choice) if input.peek(Token![default]) => { + input.parse::()?; + Choice::Choice(make_checkbox_tuple(choice, input.parse()?)) + } + Choice::Choice(choice) => { + let span = choice.span(); + Choice::Choice(make_checkbox_tuple( + choice, + syn::ExprLit { + lit: syn::LitBool { value: false, span }.into(), + attrs: Vec::new(), + } + .into(), + )) + } + sep => sep, + }; + + Ok(choice) +} diff --git a/inquisition-macros/src/lib.rs b/inquisition-macros/src/lib.rs new file mode 100644 index 0000000..29051aa --- /dev/null +++ b/inquisition-macros/src/lib.rs @@ -0,0 +1,36 @@ +extern crate proc_macro; +use proc_macro::TokenStream; + +mod helpers; +mod question; + +use question::*; +use quote::quote; +use syn::{parse::Parse, parse_macro_input, Token}; + +#[proc_macro] +pub fn questions(item: TokenStream) -> TokenStream { + let p = parse_macro_input!(item as Questions); + + let questions = p.questions.into_iter(); + + let ts = quote! { + ::std::array::IntoIter::new([ + #(#questions),* + ]) + }; + + ts.into() +} + +struct Questions { + questions: syn::punctuated::Punctuated, +} + +impl Parse for Questions { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + Ok(Self { + questions: input.parse_terminated(Question::parse)?, + }) + } +} diff --git a/inquisition-macros/src/question.rs b/inquisition-macros/src/question.rs new file mode 100644 index 0000000..8a90933 --- /dev/null +++ b/inquisition-macros/src/question.rs @@ -0,0 +1,469 @@ +use std::fmt; + +use proc_macro2::TokenStream; +use quote::{quote, quote_spanned}; +use syn::{parse::Parse, spanned::Spanned, Token}; + +use crate::helpers::*; + +bitflags::bitflags! { + pub struct BuilderMethods: u8 { + const DEFAULT = 0b000_0001; + const TRANSFORM = 0b000_0010; + const VAL_FIL = 0b000_0100; + const LIST = 0b000_1000; + const MASK = 0b001_0000; + const EXTENSION = 0b010_0000; + const PLUGIN = 0b100_0000; + } +} + +#[derive(Clone, Copy)] +pub(crate) enum QuestionKind { + Input, + Int, + Float, + Confirm, + List, + Rawlist, + Expand, + Checkbox, + Password, + Editor, + Plugin, +} + +impl QuestionKind { + fn as_str(&self) -> &str { + match self { + QuestionKind::Input => "input", + QuestionKind::Int => "int", + QuestionKind::Float => "float", + QuestionKind::Confirm => "confirm", + QuestionKind::List => "list", + QuestionKind::Rawlist => "rawlist", + QuestionKind::Expand => "expand", + QuestionKind::Checkbox => "checkbox", + QuestionKind::Password => "password", + QuestionKind::Editor => "editor", + QuestionKind::Plugin => "plugin", + } + } + + fn get_builder_methods(&self) -> BuilderMethods { + match *self { + QuestionKind::Input | QuestionKind::Int | QuestionKind::Float => { + BuilderMethods::DEFAULT + | BuilderMethods::TRANSFORM + | BuilderMethods::VAL_FIL + } + QuestionKind::Confirm => { + BuilderMethods::DEFAULT | BuilderMethods::TRANSFORM + } + QuestionKind::List | QuestionKind::Rawlist | QuestionKind::Expand => { + BuilderMethods::DEFAULT + | BuilderMethods::TRANSFORM + | BuilderMethods::LIST + } + QuestionKind::Checkbox => { + BuilderMethods::DEFAULT + | BuilderMethods::TRANSFORM + | BuilderMethods::VAL_FIL + | BuilderMethods::LIST + } + QuestionKind::Password => { + BuilderMethods::TRANSFORM + | BuilderMethods::VAL_FIL + | BuilderMethods::MASK + } + QuestionKind::Editor => { + BuilderMethods::DEFAULT + | BuilderMethods::TRANSFORM + | BuilderMethods::VAL_FIL + | BuilderMethods::EXTENSION + } + QuestionKind::Plugin => BuilderMethods::PLUGIN, + } + } +} + +impl Parse for QuestionKind { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + let ident = input.parse::()?; + + let kind = if ident == "input" { + QuestionKind::Input + } else if ident == "int" { + QuestionKind::Int + } else if ident == "float" { + QuestionKind::Float + } else if ident == "confirm" { + QuestionKind::Confirm + } else if ident == "list" { + QuestionKind::List + } else if ident == "rawlist" { + QuestionKind::Rawlist + } else if ident == "expand" { + QuestionKind::Expand + } else if ident == "checkbox" { + QuestionKind::Checkbox + } else if ident == "password" { + QuestionKind::Password + } else if ident == "editor" { + QuestionKind::Editor + } else if ident == "plugin" { + QuestionKind::Plugin + } else { + return Err(syn::Error::new( + ident.span(), + format!("unknown question kind {}", ident), + )); + }; + + Ok(kind) + } +} + +impl fmt::Display for QuestionKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.as_str()) + } +} + +pub(crate) struct QuestionOpts { + pub(crate) message: Option, + pub(crate) when: Option, + pub(crate) ask_if_answered: Option, + + pub(crate) default: Option, + + pub(crate) validate: Option, + pub(crate) filter: Option, + pub(crate) transform: Option, + pub(crate) validate_async: Option, + pub(crate) filter_async: Option, + pub(crate) transform_async: Option, + + pub(crate) choices: Option, + pub(crate) page_size: Option, + pub(crate) should_loop: Option, + + pub(crate) mask: Option, + pub(crate) extension: Option, + + pub(crate) plugin: Option, +} + +impl Default for QuestionOpts { + fn default() -> Self { + Self { + message: None, + when: None, + ask_if_answered: None, + + default: None, + + validate: None, + filter: None, + transform: None, + validate_async: None, + filter_async: None, + transform_async: None, + + choices: None, + page_size: None, + should_loop: None, + + mask: None, + extension: None, + + plugin: None, + } + } +} + +/// Checks if a _valid_ ident is disallowed +fn check_disallowed( + ident: &syn::Ident, + kind: QuestionKind, + allowed: BuilderMethods, +) -> syn::Result<()> { + #[rustfmt::skip] + fn disallowed(ident: &syn::Ident, allowed: BuilderMethods) -> bool { + (ident == "default" && + !allowed.contains(BuilderMethods::DEFAULT)) || + + ((ident == "transform_async" || + ident == "transform") && + !allowed.contains(BuilderMethods::TRANSFORM)) || + + ((ident == "validate_async" || + ident == "validate" || + ident == "filter" || + ident == "filter_async") && + !allowed.contains(BuilderMethods::VAL_FIL)) || + + ((ident == "choices" || + ident == "page_size" || + ident == "should_loop") && + !allowed.contains(BuilderMethods::LIST)) || + + (ident == "mask" && + !allowed.contains(BuilderMethods::MASK)) || + + (ident == "extension" && + !allowed.contains(BuilderMethods::EXTENSION)) || + + (ident == "plugin" && + !allowed.contains(BuilderMethods::PLUGIN)) + } + + if disallowed(ident, allowed) { + Err(syn::Error::new( + ident.span(), + format!("option `{}` does not exist for kind `{}`", ident, kind), + )) + } else { + Ok(()) + } +} + +pub(crate) struct Question { + pub(crate) kind: QuestionKind, + pub(crate) name: syn::Expr, + pub(crate) opts: QuestionOpts, +} + +impl Parse for Question { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + let kind = QuestionKind::parse(input)?; + let content; + let brace = syn::braced!(content in input); + + let mut opts = QuestionOpts::default(); + let mut name = None; + + let allowed_methods = kind.get_builder_methods(); + + while !content.is_empty() { + if content.peek(Token![async]) { + let asynct = content.parse::()?; + let ident = content.parse::()?; + + content.parse::()?; + + let full_ident_str = format!("{}_async", ident); + let full_ident = syn::Ident::new( + &full_ident_str, + asynct + .span + .join(ident.span()) + .unwrap_or_else(|| ident.span()), + ); + + check_disallowed(&full_ident, kind, allowed_methods)?; + if ident == "validate" { + insert_non_dup(full_ident, &mut opts.validate_async, &content)?; + } else if ident == "filter" { + insert_non_dup(full_ident, &mut opts.filter_async, &content)?; + } else if ident == "transform" { + insert_non_dup(full_ident, &mut opts.transform_async, &content)?; + } else { + return Err(syn::Error::new( + ident.span(), + format!("unknown question option `{}`", full_ident_str), + )); + } + } else { + let ident = content.parse::()?; + + content.parse::()?; + + // it is not an issue if ident doesn't correspond to valid option + // since check_allowed only checks if valid idents are disallowed + check_disallowed(&ident, kind, allowed_methods)?; + + // default options which are always there + if ident == "name" { + insert_non_dup(ident, &mut name, &content)?; + } else if ident == "message" { + insert_non_dup(ident, &mut opts.message, &content)?; + } else if ident == "when" { + insert_non_dup(ident, &mut opts.when, &content)?; + } else if ident == "ask_if_answered" { + insert_non_dup(ident, &mut opts.ask_if_answered, &content)?; + } else { + // the rest may or may not be there, so must be checked + // it is not an issue if ident doesn't correspond to valid option + // since check_allowed only checks if valid idents are disallowed + check_disallowed(&ident, kind, allowed_methods)?; + + if ident == "default" { + insert_non_dup(ident, &mut opts.default, &content)?; + } else if ident == "validate" { + insert_non_dup(ident, &mut opts.validate, &content)?; + } else if ident == "filter" { + insert_non_dup(ident, &mut opts.filter, &content)?; + } else if ident == "transform" { + insert_non_dup(ident, &mut opts.transform, &content)?; + } else if ident == "choices" { + match kind { + QuestionKind::Checkbox => insert_non_dup_parse( + ident, + &mut opts.choices, + &content, + Choices::parse_checkbox_choice, + )?, + _ => insert_non_dup_parse( + ident, + &mut opts.choices, + &content, + Choices::parse_choice, + )?, + } + } else if ident == "page_size" { + insert_non_dup(ident, &mut opts.page_size, &content)?; + } else if ident == "should_loop" { + insert_non_dup(ident, &mut opts.should_loop, &content)?; + } else if ident == "mask" { + insert_non_dup(ident, &mut opts.mask, &content)?; + } else if ident == "extension" { + insert_non_dup(ident, &mut opts.extension, &content)?; + } else if ident == "plugin" { + insert_non_dup(ident, &mut opts.plugin, &content)?; + } else { + return Err(syn::Error::new( + ident.span(), + format!("unknown question option `{}`", ident), + )); + } + } + } + + if parse_optional_comma(&content)?.is_none() { + break; + } + } + + if let QuestionKind::Plugin = kind { + if opts.plugin.is_none() { + return Err(syn::Error::new( + brace.span, + "missing required option `plugin`", + )); + } + } + + Ok(Self { + kind, + name: name.ok_or_else(|| { + syn::Error::new(brace.span, "missing required option `name`") + })?, + opts, + }) + } +} + +impl Question { + fn write_main_opts(&self, tokens: &mut TokenStream) { + if let Some(ref message) = self.opts.message { + tokens.extend(quote_spanned! { message.span() => .message(#message) }); + } + if let Some(ref when) = self.opts.when { + tokens.extend(quote_spanned! { when.span() => .when(#when) }); + } + if let Some(ref ask_if_answered) = self.opts.ask_if_answered { + tokens.extend(quote_spanned! { + ask_if_answered.span() => .ask_if_answered(#ask_if_answered) + }); + } + } +} + +impl quote::ToTokens for Question { + fn to_tokens(&self, tokens: &mut TokenStream) { + let name = &self.name; + + if let QuestionKind::Plugin = self.kind { + let plugin = self.opts.plugin.as_ref().unwrap(); + // If just the name was passed into Question::plugin, type errors associated + // with its conversion to a string would take the span _including_ that of + // plugin. Explicitly performing `String::from`, makes the error span due to + // the `From` trait will show the span of the name only + let name = quote_spanned! { + name.span() => String::from(#name) + }; + tokens.extend(quote_spanned! { + plugin.span() => ::inquisition::Question::plugin(#name, #plugin) + }); + self.write_main_opts(tokens); + tokens.extend(quote! { .build() }); + return; + } + + let kind = syn::Ident::new(self.kind.as_str(), name.span()); + + tokens.extend(quote_spanned! { + name.span() => ::inquisition::Question::#kind(#name) + }); + + self.write_main_opts(tokens); + if let Some(ref default) = self.opts.default { + tokens.extend(quote_spanned! { default.span() => .default(#default) }); + } + if let Some(ref validate) = self.opts.validate { + tokens + .extend(quote_spanned! { validate.span() => .validate(#validate) }); + } + if let Some(ref validate_async) = self.opts.validate_async { + tokens.extend(quote_spanned! { + validate_async.span() => .validate_async(#validate_async) + }); + } + if let Some(ref filter) = self.opts.filter { + tokens.extend(quote_spanned! { filter.span() => .filter(#filter) }); + } + if let Some(ref filter_async) = self.opts.filter_async { + tokens.extend(quote_spanned! { + filter_async.span() => .filter_async(#filter_async) + }); + } + if let Some(ref transform) = self.opts.transform { + tokens.extend( + quote_spanned! { transform.span() => .transform(#transform) }, + ); + } + if let Some(ref transform_async) = self.opts.transform_async { + tokens.extend(quote_spanned! { + transform_async.span() => .transform_async(#transform_async) + }); + } + if let Some(ref choices) = self.opts.choices { + tokens.extend(match self.kind { + QuestionKind::Checkbox => { + quote_spanned! { choices.span() => .choices_with_default(#choices) } + } + _ => quote_spanned! { choices.span() => .choices(#choices) }, + }); + } + if let Some(ref page_size) = self.opts.page_size { + tokens.extend( + quote_spanned! { page_size.span() => .page_size(#page_size) }, + ); + } + if let Some(ref should_loop) = self.opts.should_loop { + tokens.extend( + quote_spanned! { should_loop.span() => .should_loop(#should_loop) }, + ); + } + if let Some(ref mask) = self.opts.mask { + tokens.extend(quote_spanned! { mask.span() => .mask(#mask) }); + } + if let Some(ref extension) = self.opts.extension { + tokens.extend( + quote_spanned! { extension.span() => .extension(#extension) }, + ); + } + tokens.extend(quote! { .build() }); + } +} diff --git a/src/answer.rs b/src/answer.rs index 2ba8d53..8c853b6 100644 --- a/src/answer.rs +++ b/src/answer.rs @@ -124,9 +124,12 @@ pub struct ExpandItem { pub name: String, } -impl From<(char, String)> for ExpandItem { - fn from((key, name): (char, String)) -> Self { - Self { key, name } +impl> From<(char, I)> for ExpandItem { + fn from((key, name): (char, I)) -> Self { + Self { + key, + name: name.into(), + } } } diff --git a/src/lib.rs b/src/lib.rs index fa4f206..e352cf7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,11 +4,27 @@ pub mod question; use ui::{backend, error, events}; pub use answer::{Answer, Answers, ExpandItem, ListItem}; +pub use macros::questions; pub use question::{ Choice::Choice, Choice::DefaultSeparator, Choice::Separator, Question, }; pub use ui::error::{ErrorKind, Result}; +#[macro_export] +macro_rules! prompt_module { + ($($tt:tt)*) => { + $crate::PromptModule::new($crate::questions! [ $($tt)* ]) + }; +} + +pub mod plugin { + pub use crate::{question::Plugin, Answer, Answers}; + pub use ui::{backend::Backend, events::Events}; + crate::cfg_async! { + pub use ui::events::AsyncEvents; + } +} + #[derive(Debug, Clone, PartialEq)] pub struct PromptModule { questions: Q, diff --git a/src/question/choice.rs b/src/question/choice.rs index f16e3a2..1e7d5a1 100644 --- a/src/question/choice.rs +++ b/src/question/choice.rs @@ -84,7 +84,7 @@ pub enum Choice { impl Choice { pub(crate) fn is_separator(&self) -> bool { - matches!(self, Choice::Separator(_)) + matches!(self, Choice::Separator(_) | Choice::DefaultSeparator) } pub(crate) fn as_ref(&self) -> Choice<&T> { @@ -96,10 +96,9 @@ impl Choice { } pub(crate) fn unwrap_choice(self) -> T { - if let Choice::Choice(c) = self { - c - } else { - panic!("Called unwrap_choice on separator") + match self { + Choice::Choice(c) => c, + _ => panic!("Called unwrap_choice on separator"), } } } diff --git a/src/question/rawlist.rs b/src/question/rawlist.rs index e1eec91..28f5e9d 100644 --- a/src/question/rawlist.rs +++ b/src/question/rawlist.rs @@ -266,7 +266,7 @@ pub struct RawlistBuilder<'m, 'w, 't> { impl<'m, 'w, 't> RawlistBuilder<'m, 'w, 't> { pub(crate) fn new(name: String) -> Self { RawlistBuilder { - opts: Options::new(name.into()), + opts: Options::new(name), list: Default::default(), // It is one indexed for the user choice_count: 1, diff --git a/tests/macros.rs b/tests/macros.rs new file mode 100644 index 0000000..d97579a --- /dev/null +++ b/tests/macros.rs @@ -0,0 +1,208 @@ +struct Runner { + cases: trybuild::TestCases, + name: &'static str, +} + +impl Runner { + fn new(name: &'static str) -> Self { + Self { + cases: trybuild::TestCases::new(), + name, + } + } + + fn compile_fail(&self, test_name: &str) { + self.cases + .compile_fail(format!("tests/macros/{}/{}.rs", self.name, test_name)) + } + + fn pass(&self, test_name: &str) { + self.cases + .pass(format!("tests/macros/{}/{}.rs", self.name, test_name)) + } +} + +#[test] +fn duplicate() { + let t = Runner::new("duplicate"); + t.compile_fail("name"); + t.compile_fail("message"); + t.compile_fail("when"); + t.compile_fail("ask_if_answered"); + t.compile_fail("default"); + t.compile_fail("validate"); + t.compile_fail("filter"); + t.compile_fail("transform"); + t.compile_fail("validate_async"); + t.compile_fail("filter_async"); + t.compile_fail("transform_async"); + t.compile_fail("choices"); + t.compile_fail("page_size"); + t.compile_fail("should_loop"); + t.compile_fail("mask"); + t.compile_fail("extension"); + t.compile_fail("plugin"); +} + +#[test] +fn unknown() { + let t = Runner::new("unknown"); + t.compile_fail("kind"); + t.compile_fail("option"); + t.compile_fail("async-unknown"); + t.compile_fail("async-option"); +} + +#[test] +fn checkbox() { + let t = Runner::new("checkbox"); + + t.pass("valid"); + t.compile_fail("default"); + t.compile_fail("default_with_sep"); + t.compile_fail("mask"); + t.compile_fail("extension"); + t.compile_fail("plugin"); +} + +#[test] +fn confirm() { + let t = Runner::new("confirm"); + + t.pass("valid"); + t.compile_fail("filter"); + t.compile_fail("filter_async"); + t.compile_fail("validate"); + t.compile_fail("validate_async"); + t.compile_fail("choices"); + t.compile_fail("should_loop"); + t.compile_fail("page_size"); + t.compile_fail("mask"); + t.compile_fail("extension"); + t.compile_fail("plugin"); +} + +#[test] +fn editor() { + let t = Runner::new("editor"); + + t.pass("valid"); + t.compile_fail("choices"); + t.compile_fail("should_loop"); + t.compile_fail("page_size"); + t.compile_fail("mask"); + t.compile_fail("plugin"); +} + +#[test] +fn expand() { + let t = Runner::new("expand"); + + t.pass("valid"); + t.compile_fail("filter"); + t.compile_fail("filter_async"); + t.compile_fail("validate"); + t.compile_fail("validate_async"); + t.compile_fail("mask"); + t.compile_fail("extension"); + t.compile_fail("plugin"); +} + +#[test] +fn float() { + let t = Runner::new("float"); + + t.pass("valid"); + t.compile_fail("choices"); + t.compile_fail("should_loop"); + t.compile_fail("page_size"); + t.compile_fail("mask"); + t.compile_fail("extension"); + t.compile_fail("plugin"); +} + +#[test] +fn input() { + let t = Runner::new("input"); + + t.pass("valid"); + t.compile_fail("choices"); + t.compile_fail("should_loop"); + t.compile_fail("page_size"); + t.compile_fail("mask"); + t.compile_fail("extension"); + t.compile_fail("plugin"); +} + +#[test] +fn int() { + let t = Runner::new("int"); + + t.pass("valid"); + t.compile_fail("choices"); + t.compile_fail("should_loop"); + t.compile_fail("page_size"); + t.compile_fail("mask"); + t.compile_fail("extension"); + t.compile_fail("plugin"); +} + +#[test] +fn list() { + let t = Runner::new("list"); + + t.pass("valid"); + t.compile_fail("filter"); + t.compile_fail("filter_async"); + t.compile_fail("validate"); + t.compile_fail("validate_async"); + t.compile_fail("mask"); + t.compile_fail("extension"); + t.compile_fail("plugin"); +} + +#[test] +fn password() { + let t = Runner::new("password"); + + t.pass("valid"); + t.compile_fail("default"); + t.compile_fail("choices"); + t.compile_fail("should_loop"); + t.compile_fail("page_size"); + t.compile_fail("extension"); + t.compile_fail("plugin"); +} + +#[test] +fn plugin() { + let t = Runner::new("plugin"); + + t.pass("valid"); + t.compile_fail("default"); + t.compile_fail("transform"); + t.compile_fail("transform_async"); + t.compile_fail("filter"); + t.compile_fail("filter_async"); + t.compile_fail("validate"); + t.compile_fail("validate_async"); + t.compile_fail("choices"); + t.compile_fail("should_loop"); + t.compile_fail("page_size"); + t.compile_fail("mask"); + t.compile_fail("extension"); +} + +#[test] +fn rawlist() { + let t = Runner::new("rawlist"); + + t.pass("valid"); + t.compile_fail("filter"); + t.compile_fail("filter_async"); + t.compile_fail("validate"); + t.compile_fail("validate_async"); + t.compile_fail("mask"); + t.compile_fail("extension"); + t.compile_fail("plugin"); +} diff --git a/tests/macros/checkbox/default.rs b/tests/macros/checkbox/default.rs new file mode 100644 index 0000000..28c79a8 --- /dev/null +++ b/tests/macros/checkbox/default.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![checkbox { default: todo!() }]; +} diff --git a/tests/macros/checkbox/default.stderr b/tests/macros/checkbox/default.stderr new file mode 100644 index 0000000..461c7e2 --- /dev/null +++ b/tests/macros/checkbox/default.stderr @@ -0,0 +1,5 @@ +error: missing required option `name` + --> $DIR/default.rs:2:38 + | +2 | inquisition::questions![checkbox { default: todo!() }]; + | ^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/macros/checkbox/default_with_sep.rs b/tests/macros/checkbox/default_with_sep.rs new file mode 100644 index 0000000..4c21315 --- /dev/null +++ b/tests/macros/checkbox/default_with_sep.rs @@ -0,0 +1,10 @@ +fn main() { + inquisition::questions! [ + checkbox { + name: "name", + choices: [ + sep "separator" default true, + ], + } + ]; +} diff --git a/tests/macros/checkbox/default_with_sep.stderr b/tests/macros/checkbox/default_with_sep.stderr new file mode 100644 index 0000000..8396f3b --- /dev/null +++ b/tests/macros/checkbox/default_with_sep.stderr @@ -0,0 +1,5 @@ +error: expected `,` + --> $DIR/default_with_sep.rs:6:33 + | +6 | sep "separator" default true, + | ^^^^^^^ diff --git a/tests/macros/checkbox/extension.rs b/tests/macros/checkbox/extension.rs new file mode 100644 index 0000000..7136425 --- /dev/null +++ b/tests/macros/checkbox/extension.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![checkbox { extension: todo!() }]; +} diff --git a/tests/macros/checkbox/extension.stderr b/tests/macros/checkbox/extension.stderr new file mode 100644 index 0000000..109c279 --- /dev/null +++ b/tests/macros/checkbox/extension.stderr @@ -0,0 +1,5 @@ +error: option `extension` does not exist for kind `checkbox` + --> $DIR/extension.rs:2:48 + | +2 | let q = inquisition::questions![checkbox { extension: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/checkbox/mask.rs b/tests/macros/checkbox/mask.rs new file mode 100644 index 0000000..168e4b6 --- /dev/null +++ b/tests/macros/checkbox/mask.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![checkbox { mask: todo!() }]; +} diff --git a/tests/macros/checkbox/mask.stderr b/tests/macros/checkbox/mask.stderr new file mode 100644 index 0000000..9302a0f --- /dev/null +++ b/tests/macros/checkbox/mask.stderr @@ -0,0 +1,5 @@ +error: option `mask` does not exist for kind `checkbox` + --> $DIR/mask.rs:2:48 + | +2 | let q = inquisition::questions![checkbox { mask: todo!() }]; + | ^^^^ diff --git a/tests/macros/checkbox/plugin.rs b/tests/macros/checkbox/plugin.rs new file mode 100644 index 0000000..fd0d27d --- /dev/null +++ b/tests/macros/checkbox/plugin.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![checkbox { plugin: todo!() }]; +} diff --git a/tests/macros/checkbox/plugin.stderr b/tests/macros/checkbox/plugin.stderr new file mode 100644 index 0000000..e6a97d3 --- /dev/null +++ b/tests/macros/checkbox/plugin.stderr @@ -0,0 +1,5 @@ +error: option `plugin` does not exist for kind `checkbox` + --> $DIR/plugin.rs:2:48 + | +2 | let q = inquisition::questions![checkbox { plugin: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/checkbox/valid.rs b/tests/macros/checkbox/valid.rs new file mode 100644 index 0000000..613e919 --- /dev/null +++ b/tests/macros/checkbox/valid.rs @@ -0,0 +1,27 @@ +fn main() { + let choice = "choice"; + let default_choice = true; + + inquisition::questions! [ + checkbox { + name: "name", + transform: |_, _, _| Ok(()), + async transform: |_, _, _| Box::pin(async { Ok(()) }), + validate: |_, _| Ok(()), + async validate: |_, _| Box::pin(async { Ok(()) }), + filter: |t, _| t, + async filter: |t, _| Box::pin(async move { t }), + choices: [ + sep, + sep "separator", + separator, + separator "separator", + "choice", + "choice" default true, + choice default default_choice || false, + ], + page_size: 0, + should_loop: true, + } + ]; +} diff --git a/tests/macros/confirm/choices.rs b/tests/macros/confirm/choices.rs new file mode 100644 index 0000000..d61e840 --- /dev/null +++ b/tests/macros/confirm/choices.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![confirm { choices: todo!() }]; +} diff --git a/tests/macros/confirm/choices.stderr b/tests/macros/confirm/choices.stderr new file mode 100644 index 0000000..6c993fd --- /dev/null +++ b/tests/macros/confirm/choices.stderr @@ -0,0 +1,5 @@ +error: option `choices` does not exist for kind `confirm` + --> $DIR/choices.rs:2:39 + | +2 | inquisition::questions![confirm { choices: todo!() }]; + | ^^^^^^^ diff --git a/tests/macros/confirm/extension.rs b/tests/macros/confirm/extension.rs new file mode 100644 index 0000000..8643d59 --- /dev/null +++ b/tests/macros/confirm/extension.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![confirm { extension: todo!() }]; +} diff --git a/tests/macros/confirm/extension.stderr b/tests/macros/confirm/extension.stderr new file mode 100644 index 0000000..685b3e2 --- /dev/null +++ b/tests/macros/confirm/extension.stderr @@ -0,0 +1,5 @@ +error: option `extension` does not exist for kind `confirm` + --> $DIR/extension.rs:2:47 + | +2 | let q = inquisition::questions![confirm { extension: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/confirm/filter.rs b/tests/macros/confirm/filter.rs new file mode 100644 index 0000000..1981e57 --- /dev/null +++ b/tests/macros/confirm/filter.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![confirm { filter: todo!() }]; +} diff --git a/tests/macros/confirm/filter.stderr b/tests/macros/confirm/filter.stderr new file mode 100644 index 0000000..3e0423f --- /dev/null +++ b/tests/macros/confirm/filter.stderr @@ -0,0 +1,5 @@ +error: option `filter` does not exist for kind `confirm` + --> $DIR/filter.rs:2:47 + | +2 | let q = inquisition::questions![confirm { filter: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/confirm/filter_async.rs b/tests/macros/confirm/filter_async.rs new file mode 100644 index 0000000..a6f1550 --- /dev/null +++ b/tests/macros/confirm/filter_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![confirm { async filter: todo!() }]; +} diff --git a/tests/macros/confirm/filter_async.stderr b/tests/macros/confirm/filter_async.stderr new file mode 100644 index 0000000..0a364e1 --- /dev/null +++ b/tests/macros/confirm/filter_async.stderr @@ -0,0 +1,5 @@ +error: option `filter_async` does not exist for kind `confirm` + --> $DIR/filter_async.rs:2:53 + | +2 | let q = inquisition::questions![confirm { async filter: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/confirm/mask.rs b/tests/macros/confirm/mask.rs new file mode 100644 index 0000000..bac223a --- /dev/null +++ b/tests/macros/confirm/mask.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![confirm { mask: todo!() }]; +} diff --git a/tests/macros/confirm/mask.stderr b/tests/macros/confirm/mask.stderr new file mode 100644 index 0000000..18d9bd1 --- /dev/null +++ b/tests/macros/confirm/mask.stderr @@ -0,0 +1,5 @@ +error: option `mask` does not exist for kind `confirm` + --> $DIR/mask.rs:2:47 + | +2 | let q = inquisition::questions![confirm { mask: todo!() }]; + | ^^^^ diff --git a/tests/macros/confirm/page_size.rs b/tests/macros/confirm/page_size.rs new file mode 100644 index 0000000..bf044a5 --- /dev/null +++ b/tests/macros/confirm/page_size.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![confirm { page_size: todo!() }]; +} diff --git a/tests/macros/confirm/page_size.stderr b/tests/macros/confirm/page_size.stderr new file mode 100644 index 0000000..5c55c09 --- /dev/null +++ b/tests/macros/confirm/page_size.stderr @@ -0,0 +1,5 @@ +error: option `page_size` does not exist for kind `confirm` + --> $DIR/page_size.rs:2:39 + | +2 | inquisition::questions![confirm { page_size: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/confirm/plugin.rs b/tests/macros/confirm/plugin.rs new file mode 100644 index 0000000..ad07a38 --- /dev/null +++ b/tests/macros/confirm/plugin.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![confirm { plugin: todo!() }]; +} diff --git a/tests/macros/confirm/plugin.stderr b/tests/macros/confirm/plugin.stderr new file mode 100644 index 0000000..f8ffd55 --- /dev/null +++ b/tests/macros/confirm/plugin.stderr @@ -0,0 +1,5 @@ +error: option `plugin` does not exist for kind `confirm` + --> $DIR/plugin.rs:2:47 + | +2 | let q = inquisition::questions![confirm { plugin: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/confirm/should_loop.rs b/tests/macros/confirm/should_loop.rs new file mode 100644 index 0000000..11a4075 --- /dev/null +++ b/tests/macros/confirm/should_loop.rs @@ -0,0 +1,5 @@ +fn main() { + inquisition::questions![confirm { + should_loop: todo!() + }]; +} diff --git a/tests/macros/confirm/should_loop.stderr b/tests/macros/confirm/should_loop.stderr new file mode 100644 index 0000000..9599e57 --- /dev/null +++ b/tests/macros/confirm/should_loop.stderr @@ -0,0 +1,5 @@ +error: option `should_loop` does not exist for kind `confirm` + --> $DIR/should_loop.rs:3:9 + | +3 | should_loop: todo!() + | ^^^^^^^^^^^ diff --git a/tests/macros/confirm/valid.rs b/tests/macros/confirm/valid.rs new file mode 100644 index 0000000..eaaba46 --- /dev/null +++ b/tests/macros/confirm/valid.rs @@ -0,0 +1,8 @@ +fn main() { + inquisition::questions![confirm { + name: "name", + default: true, + transform: |_, _, _| Ok(()), + async transform: |_, _, _| Box::pin(async { Ok(()) }), + }]; +} diff --git a/tests/macros/confirm/validate.rs b/tests/macros/confirm/validate.rs new file mode 100644 index 0000000..6853ace --- /dev/null +++ b/tests/macros/confirm/validate.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![confirm { validate: todo!() }]; +} diff --git a/tests/macros/confirm/validate.stderr b/tests/macros/confirm/validate.stderr new file mode 100644 index 0000000..e7d203b --- /dev/null +++ b/tests/macros/confirm/validate.stderr @@ -0,0 +1,5 @@ +error: option `validate` does not exist for kind `confirm` + --> $DIR/validate.rs:2:47 + | +2 | let q = inquisition::questions![confirm { validate: todo!() }]; + | ^^^^^^^^ diff --git a/tests/macros/confirm/validate_async.rs b/tests/macros/confirm/validate_async.rs new file mode 100644 index 0000000..d62932b --- /dev/null +++ b/tests/macros/confirm/validate_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![confirm { async validate: todo!() }]; +} diff --git a/tests/macros/confirm/validate_async.stderr b/tests/macros/confirm/validate_async.stderr new file mode 100644 index 0000000..8ad0628 --- /dev/null +++ b/tests/macros/confirm/validate_async.stderr @@ -0,0 +1,5 @@ +error: option `validate_async` does not exist for kind `confirm` + --> $DIR/validate_async.rs:2:53 + | +2 | let q = inquisition::questions![confirm { async validate: todo!() }]; + | ^^^^^^^^ diff --git a/tests/macros/duplicate/ask_if_answered.rs b/tests/macros/duplicate/ask_if_answered.rs new file mode 100644 index 0000000..20a79f7 --- /dev/null +++ b/tests/macros/duplicate/ask_if_answered.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + ask_if_answered: todo!(), + ask_if_answered: todo!(), + }]; +} diff --git a/tests/macros/duplicate/ask_if_answered.stderr b/tests/macros/duplicate/ask_if_answered.stderr new file mode 100644 index 0000000..3df4728 --- /dev/null +++ b/tests/macros/duplicate/ask_if_answered.stderr @@ -0,0 +1,5 @@ +error: duplicate option `ask_if_answered` + --> $DIR/ask_if_answered.rs:4:9 + | +4 | ask_if_answered: todo!(), + | ^^^^^^^^^^^^^^^ diff --git a/tests/macros/duplicate/choices.rs b/tests/macros/duplicate/choices.rs new file mode 100644 index 0000000..e028e7c --- /dev/null +++ b/tests/macros/duplicate/choices.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![list { + choices: todo!(), + choices: todo!(), + }]; +} diff --git a/tests/macros/duplicate/choices.stderr b/tests/macros/duplicate/choices.stderr new file mode 100644 index 0000000..1be9dec --- /dev/null +++ b/tests/macros/duplicate/choices.stderr @@ -0,0 +1,5 @@ +error: duplicate option `choices` + --> $DIR/choices.rs:4:9 + | +4 | choices: todo!(), + | ^^^^^^^ diff --git a/tests/macros/duplicate/default.rs b/tests/macros/duplicate/default.rs new file mode 100644 index 0000000..4120744 --- /dev/null +++ b/tests/macros/duplicate/default.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + default: todo!(), + default: todo!(), + }]; +} diff --git a/tests/macros/duplicate/default.stderr b/tests/macros/duplicate/default.stderr new file mode 100644 index 0000000..fb39260 --- /dev/null +++ b/tests/macros/duplicate/default.stderr @@ -0,0 +1,5 @@ +error: duplicate option `default` + --> $DIR/default.rs:4:9 + | +4 | default: todo!(), + | ^^^^^^^ diff --git a/tests/macros/duplicate/extension.rs b/tests/macros/duplicate/extension.rs new file mode 100644 index 0000000..ebce215 --- /dev/null +++ b/tests/macros/duplicate/extension.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![editor { + extension: todo!(), + extension: todo!(), + }]; +} diff --git a/tests/macros/duplicate/extension.stderr b/tests/macros/duplicate/extension.stderr new file mode 100644 index 0000000..44337c2 --- /dev/null +++ b/tests/macros/duplicate/extension.stderr @@ -0,0 +1,5 @@ +error: duplicate option `extension` + --> $DIR/extension.rs:4:9 + | +4 | extension: todo!(), + | ^^^^^^^^^ diff --git a/tests/macros/duplicate/filter.rs b/tests/macros/duplicate/filter.rs new file mode 100644 index 0000000..62802d9 --- /dev/null +++ b/tests/macros/duplicate/filter.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + filter: todo!(), + filter: todo!(), + }]; +} diff --git a/tests/macros/duplicate/filter.stderr b/tests/macros/duplicate/filter.stderr new file mode 100644 index 0000000..ea22de2 --- /dev/null +++ b/tests/macros/duplicate/filter.stderr @@ -0,0 +1,5 @@ +error: duplicate option `filter` + --> $DIR/filter.rs:4:9 + | +4 | filter: todo!(), + | ^^^^^^ diff --git a/tests/macros/duplicate/filter_async.rs b/tests/macros/duplicate/filter_async.rs new file mode 100644 index 0000000..5f5e25e --- /dev/null +++ b/tests/macros/duplicate/filter_async.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + filter_async: todo!(), + filter_async: todo!(), + }]; +} diff --git a/tests/macros/duplicate/filter_async.stderr b/tests/macros/duplicate/filter_async.stderr new file mode 100644 index 0000000..a91a6b1 --- /dev/null +++ b/tests/macros/duplicate/filter_async.stderr @@ -0,0 +1,5 @@ +error: unknown question option `filter_async` + --> $DIR/filter_async.rs:3:9 + | +3 | filter_async: todo!(), + | ^^^^^^^^^^^^ diff --git a/tests/macros/duplicate/mask.rs b/tests/macros/duplicate/mask.rs new file mode 100644 index 0000000..33544c5 --- /dev/null +++ b/tests/macros/duplicate/mask.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![password { + mask: todo!(), + mask: todo!(), + }]; +} diff --git a/tests/macros/duplicate/mask.stderr b/tests/macros/duplicate/mask.stderr new file mode 100644 index 0000000..890e659 --- /dev/null +++ b/tests/macros/duplicate/mask.stderr @@ -0,0 +1,5 @@ +error: duplicate option `mask` + --> $DIR/mask.rs:4:9 + | +4 | mask: todo!(), + | ^^^^ diff --git a/tests/macros/duplicate/message.rs b/tests/macros/duplicate/message.rs new file mode 100644 index 0000000..61bfb67 --- /dev/null +++ b/tests/macros/duplicate/message.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + message: todo!(), + message: todo!(), + }]; +} diff --git a/tests/macros/duplicate/message.stderr b/tests/macros/duplicate/message.stderr new file mode 100644 index 0000000..b5d2919 --- /dev/null +++ b/tests/macros/duplicate/message.stderr @@ -0,0 +1,5 @@ +error: duplicate option `message` + --> $DIR/message.rs:4:9 + | +4 | message: todo!(), + | ^^^^^^^ diff --git a/tests/macros/duplicate/name.rs b/tests/macros/duplicate/name.rs new file mode 100644 index 0000000..897a77d --- /dev/null +++ b/tests/macros/duplicate/name.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + name: todo!(), + name: todo!(), + }]; +} diff --git a/tests/macros/duplicate/name.stderr b/tests/macros/duplicate/name.stderr new file mode 100644 index 0000000..780f9d6 --- /dev/null +++ b/tests/macros/duplicate/name.stderr @@ -0,0 +1,5 @@ +error: duplicate option `name` + --> $DIR/name.rs:4:9 + | +4 | name: todo!(), + | ^^^^ diff --git a/tests/macros/duplicate/page_size.rs b/tests/macros/duplicate/page_size.rs new file mode 100644 index 0000000..4fca5e3 --- /dev/null +++ b/tests/macros/duplicate/page_size.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![list { + page_size: todo!(), + page_size: todo!(), + }]; +} diff --git a/tests/macros/duplicate/page_size.stderr b/tests/macros/duplicate/page_size.stderr new file mode 100644 index 0000000..8baab25 --- /dev/null +++ b/tests/macros/duplicate/page_size.stderr @@ -0,0 +1,5 @@ +error: duplicate option `page_size` + --> $DIR/page_size.rs:4:9 + | +4 | page_size: todo!(), + | ^^^^^^^^^ diff --git a/tests/macros/duplicate/plugin.rs b/tests/macros/duplicate/plugin.rs new file mode 100644 index 0000000..829af48 --- /dev/null +++ b/tests/macros/duplicate/plugin.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![plugin { + plugin: todo!(), + plugin: todo!(), + }]; +} diff --git a/tests/macros/duplicate/plugin.stderr b/tests/macros/duplicate/plugin.stderr new file mode 100644 index 0000000..a3c1bf9 --- /dev/null +++ b/tests/macros/duplicate/plugin.stderr @@ -0,0 +1,5 @@ +error: duplicate option `plugin` + --> $DIR/plugin.rs:4:9 + | +4 | plugin: todo!(), + | ^^^^^^ diff --git a/tests/macros/duplicate/should_loop.rs b/tests/macros/duplicate/should_loop.rs new file mode 100644 index 0000000..a00e4e5 --- /dev/null +++ b/tests/macros/duplicate/should_loop.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![list { + should_loop: todo!(), + should_loop: todo!(), + }]; +} diff --git a/tests/macros/duplicate/should_loop.stderr b/tests/macros/duplicate/should_loop.stderr new file mode 100644 index 0000000..30dcb6c --- /dev/null +++ b/tests/macros/duplicate/should_loop.stderr @@ -0,0 +1,5 @@ +error: duplicate option `should_loop` + --> $DIR/should_loop.rs:4:9 + | +4 | should_loop: todo!(), + | ^^^^^^^^^^^ diff --git a/tests/macros/duplicate/transform.rs b/tests/macros/duplicate/transform.rs new file mode 100644 index 0000000..34e5072 --- /dev/null +++ b/tests/macros/duplicate/transform.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + transform: todo!(), + transform: todo!(), + }]; +} diff --git a/tests/macros/duplicate/transform.stderr b/tests/macros/duplicate/transform.stderr new file mode 100644 index 0000000..1101fb4 --- /dev/null +++ b/tests/macros/duplicate/transform.stderr @@ -0,0 +1,5 @@ +error: duplicate option `transform` + --> $DIR/transform.rs:4:9 + | +4 | transform: todo!(), + | ^^^^^^^^^ diff --git a/tests/macros/duplicate/transform_async.rs b/tests/macros/duplicate/transform_async.rs new file mode 100644 index 0000000..96bf269 --- /dev/null +++ b/tests/macros/duplicate/transform_async.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + transform_async: todo!(), + transform_async: todo!(), + }]; +} diff --git a/tests/macros/duplicate/transform_async.stderr b/tests/macros/duplicate/transform_async.stderr new file mode 100644 index 0000000..3b72c7d --- /dev/null +++ b/tests/macros/duplicate/transform_async.stderr @@ -0,0 +1,5 @@ +error: unknown question option `transform_async` + --> $DIR/transform_async.rs:3:9 + | +3 | transform_async: todo!(), + | ^^^^^^^^^^^^^^^ diff --git a/tests/macros/duplicate/validate.rs b/tests/macros/duplicate/validate.rs new file mode 100644 index 0000000..edc7f50 --- /dev/null +++ b/tests/macros/duplicate/validate.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + validate: todo!(), + validate: todo!(), + }]; +} diff --git a/tests/macros/duplicate/validate.stderr b/tests/macros/duplicate/validate.stderr new file mode 100644 index 0000000..b07a019 --- /dev/null +++ b/tests/macros/duplicate/validate.stderr @@ -0,0 +1,5 @@ +error: duplicate option `validate` + --> $DIR/validate.rs:4:9 + | +4 | validate: todo!(), + | ^^^^^^^^ diff --git a/tests/macros/duplicate/validate_async.rs b/tests/macros/duplicate/validate_async.rs new file mode 100644 index 0000000..239c35b --- /dev/null +++ b/tests/macros/duplicate/validate_async.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + validate_async: todo!(), + validate_async: todo!(), + }]; +} diff --git a/tests/macros/duplicate/validate_async.stderr b/tests/macros/duplicate/validate_async.stderr new file mode 100644 index 0000000..281a84c --- /dev/null +++ b/tests/macros/duplicate/validate_async.stderr @@ -0,0 +1,5 @@ +error: unknown question option `validate_async` + --> $DIR/validate_async.rs:3:9 + | +3 | validate_async: todo!(), + | ^^^^^^^^^^^^^^ diff --git a/tests/macros/duplicate/when.rs b/tests/macros/duplicate/when.rs new file mode 100644 index 0000000..1f6aad6 --- /dev/null +++ b/tests/macros/duplicate/when.rs @@ -0,0 +1,6 @@ +fn main() { + let q = inquisition::questions![input { + when: todo!(), + when: todo!(), + }]; +} diff --git a/tests/macros/duplicate/when.stderr b/tests/macros/duplicate/when.stderr new file mode 100644 index 0000000..35ffbfb --- /dev/null +++ b/tests/macros/duplicate/when.stderr @@ -0,0 +1,5 @@ +error: duplicate option `when` + --> $DIR/when.rs:4:9 + | +4 | when: todo!(), + | ^^^^ diff --git a/tests/macros/editor/choices.rs b/tests/macros/editor/choices.rs new file mode 100644 index 0000000..a158909 --- /dev/null +++ b/tests/macros/editor/choices.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![editor { choices: todo!() }]; +} diff --git a/tests/macros/editor/choices.stderr b/tests/macros/editor/choices.stderr new file mode 100644 index 0000000..06c4ccd --- /dev/null +++ b/tests/macros/editor/choices.stderr @@ -0,0 +1,5 @@ +error: option `choices` does not exist for kind `editor` + --> $DIR/choices.rs:2:38 + | +2 | inquisition::questions![editor { choices: todo!() }]; + | ^^^^^^^ diff --git a/tests/macros/editor/mask.rs b/tests/macros/editor/mask.rs new file mode 100644 index 0000000..2636eb4 --- /dev/null +++ b/tests/macros/editor/mask.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![editor { mask: todo!() }]; +} diff --git a/tests/macros/editor/mask.stderr b/tests/macros/editor/mask.stderr new file mode 100644 index 0000000..e1014da --- /dev/null +++ b/tests/macros/editor/mask.stderr @@ -0,0 +1,5 @@ +error: option `mask` does not exist for kind `editor` + --> $DIR/mask.rs:2:46 + | +2 | let q = inquisition::questions![editor { mask: todo!() }]; + | ^^^^ diff --git a/tests/macros/editor/page_size.rs b/tests/macros/editor/page_size.rs new file mode 100644 index 0000000..035febc --- /dev/null +++ b/tests/macros/editor/page_size.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![editor { page_size: todo!() }]; +} diff --git a/tests/macros/editor/page_size.stderr b/tests/macros/editor/page_size.stderr new file mode 100644 index 0000000..fcfdd9b --- /dev/null +++ b/tests/macros/editor/page_size.stderr @@ -0,0 +1,5 @@ +error: option `page_size` does not exist for kind `editor` + --> $DIR/page_size.rs:2:38 + | +2 | inquisition::questions![editor { page_size: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/editor/plugin.rs b/tests/macros/editor/plugin.rs new file mode 100644 index 0000000..45ded55 --- /dev/null +++ b/tests/macros/editor/plugin.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![editor { plugin: todo!() }]; +} diff --git a/tests/macros/editor/plugin.stderr b/tests/macros/editor/plugin.stderr new file mode 100644 index 0000000..2929194 --- /dev/null +++ b/tests/macros/editor/plugin.stderr @@ -0,0 +1,5 @@ +error: option `plugin` does not exist for kind `editor` + --> $DIR/plugin.rs:2:46 + | +2 | let q = inquisition::questions![editor { plugin: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/editor/should_loop.rs b/tests/macros/editor/should_loop.rs new file mode 100644 index 0000000..d3206a7 --- /dev/null +++ b/tests/macros/editor/should_loop.rs @@ -0,0 +1,5 @@ +fn main() { + inquisition::questions![editor { + should_loop: todo!() + }]; +} diff --git a/tests/macros/editor/should_loop.stderr b/tests/macros/editor/should_loop.stderr new file mode 100644 index 0000000..bf553ca --- /dev/null +++ b/tests/macros/editor/should_loop.stderr @@ -0,0 +1,5 @@ +error: option `should_loop` does not exist for kind `editor` + --> $DIR/should_loop.rs:3:9 + | +3 | should_loop: todo!() + | ^^^^^^^^^^^ diff --git a/tests/macros/editor/valid.rs b/tests/macros/editor/valid.rs new file mode 100644 index 0000000..17c35a7 --- /dev/null +++ b/tests/macros/editor/valid.rs @@ -0,0 +1,15 @@ +fn main() { + inquisition::questions! [ + editor { + name: "name", + default: "hello world", + extension: ".rs", + transform: |_, _, _| Ok(()), + async transform: |_, _, _| Box::pin(async { Ok(()) }), + validate: |_, _| Ok(()), + async validate: |_, _| Box::pin(async { Ok(()) }), + filter: |t, _| t, + async filter: |t, _| Box::pin(async move { t }), + } + ]; +} diff --git a/tests/macros/expand/extension.rs b/tests/macros/expand/extension.rs new file mode 100644 index 0000000..c80846b --- /dev/null +++ b/tests/macros/expand/extension.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![expand { extension: todo!() }]; +} diff --git a/tests/macros/expand/extension.stderr b/tests/macros/expand/extension.stderr new file mode 100644 index 0000000..b3f0b3e --- /dev/null +++ b/tests/macros/expand/extension.stderr @@ -0,0 +1,5 @@ +error: option `extension` does not exist for kind `expand` + --> $DIR/extension.rs:2:46 + | +2 | let q = inquisition::questions![expand { extension: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/expand/filter.rs b/tests/macros/expand/filter.rs new file mode 100644 index 0000000..d93b626 --- /dev/null +++ b/tests/macros/expand/filter.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![expand { filter: todo!() }]; +} diff --git a/tests/macros/expand/filter.stderr b/tests/macros/expand/filter.stderr new file mode 100644 index 0000000..7bc8034 --- /dev/null +++ b/tests/macros/expand/filter.stderr @@ -0,0 +1,5 @@ +error: option `filter` does not exist for kind `expand` + --> $DIR/filter.rs:2:46 + | +2 | let q = inquisition::questions![expand { filter: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/expand/filter_async.rs b/tests/macros/expand/filter_async.rs new file mode 100644 index 0000000..b72ad68 --- /dev/null +++ b/tests/macros/expand/filter_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![expand { async filter: todo!() }]; +} diff --git a/tests/macros/expand/filter_async.stderr b/tests/macros/expand/filter_async.stderr new file mode 100644 index 0000000..f1e54cd --- /dev/null +++ b/tests/macros/expand/filter_async.stderr @@ -0,0 +1,5 @@ +error: option `filter_async` does not exist for kind `expand` + --> $DIR/filter_async.rs:2:52 + | +2 | let q = inquisition::questions![expand { async filter: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/expand/mask.rs b/tests/macros/expand/mask.rs new file mode 100644 index 0000000..2d8e365 --- /dev/null +++ b/tests/macros/expand/mask.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![expand { mask: todo!() }]; +} diff --git a/tests/macros/expand/mask.stderr b/tests/macros/expand/mask.stderr new file mode 100644 index 0000000..795390f --- /dev/null +++ b/tests/macros/expand/mask.stderr @@ -0,0 +1,5 @@ +error: option `mask` does not exist for kind `expand` + --> $DIR/mask.rs:2:46 + | +2 | let q = inquisition::questions![expand { mask: todo!() }]; + | ^^^^ diff --git a/tests/macros/expand/plugin.rs b/tests/macros/expand/plugin.rs new file mode 100644 index 0000000..ba75dbc --- /dev/null +++ b/tests/macros/expand/plugin.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![expand { plugin: todo!() }]; +} diff --git a/tests/macros/expand/plugin.stderr b/tests/macros/expand/plugin.stderr new file mode 100644 index 0000000..c271936 --- /dev/null +++ b/tests/macros/expand/plugin.stderr @@ -0,0 +1,5 @@ +error: option `plugin` does not exist for kind `expand` + --> $DIR/plugin.rs:2:46 + | +2 | let q = inquisition::questions![expand { plugin: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/expand/valid.rs b/tests/macros/expand/valid.rs new file mode 100644 index 0000000..ca25355 --- /dev/null +++ b/tests/macros/expand/valid.rs @@ -0,0 +1,13 @@ +fn main() { + inquisition::questions! [ + expand { + name: "name", + default: 'c', + transform: |_, _, _| Ok(()), + async transform: |_, _, _| Box::pin(async { Ok(()) }), + choices: [('c', "choice")], + page_size: 0, + should_loop: true, + } + ]; +} diff --git a/tests/macros/expand/validate.rs b/tests/macros/expand/validate.rs new file mode 100644 index 0000000..6e8271e --- /dev/null +++ b/tests/macros/expand/validate.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![expand { validate: todo!() }]; +} diff --git a/tests/macros/expand/validate.stderr b/tests/macros/expand/validate.stderr new file mode 100644 index 0000000..ec92b15 --- /dev/null +++ b/tests/macros/expand/validate.stderr @@ -0,0 +1,5 @@ +error: option `validate` does not exist for kind `expand` + --> $DIR/validate.rs:2:46 + | +2 | let q = inquisition::questions![expand { validate: todo!() }]; + | ^^^^^^^^ diff --git a/tests/macros/expand/validate_async.rs b/tests/macros/expand/validate_async.rs new file mode 100644 index 0000000..3703388 --- /dev/null +++ b/tests/macros/expand/validate_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![expand { async validate: todo!() }]; +} diff --git a/tests/macros/expand/validate_async.stderr b/tests/macros/expand/validate_async.stderr new file mode 100644 index 0000000..f31b458 --- /dev/null +++ b/tests/macros/expand/validate_async.stderr @@ -0,0 +1,5 @@ +error: option `validate_async` does not exist for kind `expand` + --> $DIR/validate_async.rs:2:52 + | +2 | let q = inquisition::questions![expand { async validate: todo!() }]; + | ^^^^^^^^ diff --git a/tests/macros/float/choices.rs b/tests/macros/float/choices.rs new file mode 100644 index 0000000..e01d6e7 --- /dev/null +++ b/tests/macros/float/choices.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![float { choices: todo!() }]; +} diff --git a/tests/macros/float/choices.stderr b/tests/macros/float/choices.stderr new file mode 100644 index 0000000..018b9d2 --- /dev/null +++ b/tests/macros/float/choices.stderr @@ -0,0 +1,5 @@ +error: option `choices` does not exist for kind `float` + --> $DIR/choices.rs:2:37 + | +2 | inquisition::questions![float { choices: todo!() }]; + | ^^^^^^^ diff --git a/tests/macros/float/extension.rs b/tests/macros/float/extension.rs new file mode 100644 index 0000000..58b931b --- /dev/null +++ b/tests/macros/float/extension.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![float { extension: todo!() }]; +} diff --git a/tests/macros/float/extension.stderr b/tests/macros/float/extension.stderr new file mode 100644 index 0000000..3e4cfe3 --- /dev/null +++ b/tests/macros/float/extension.stderr @@ -0,0 +1,5 @@ +error: option `extension` does not exist for kind `float` + --> $DIR/extension.rs:2:45 + | +2 | let q = inquisition::questions![float { extension: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/float/mask.rs b/tests/macros/float/mask.rs new file mode 100644 index 0000000..58499f7 --- /dev/null +++ b/tests/macros/float/mask.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![float { mask: todo!() }]; +} diff --git a/tests/macros/float/mask.stderr b/tests/macros/float/mask.stderr new file mode 100644 index 0000000..67dbae6 --- /dev/null +++ b/tests/macros/float/mask.stderr @@ -0,0 +1,5 @@ +error: option `mask` does not exist for kind `float` + --> $DIR/mask.rs:2:45 + | +2 | let q = inquisition::questions![float { mask: todo!() }]; + | ^^^^ diff --git a/tests/macros/float/page_size.rs b/tests/macros/float/page_size.rs new file mode 100644 index 0000000..5c5ca4a --- /dev/null +++ b/tests/macros/float/page_size.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![float { page_size: todo!() }]; +} diff --git a/tests/macros/float/page_size.stderr b/tests/macros/float/page_size.stderr new file mode 100644 index 0000000..e2d147a --- /dev/null +++ b/tests/macros/float/page_size.stderr @@ -0,0 +1,5 @@ +error: option `page_size` does not exist for kind `float` + --> $DIR/page_size.rs:2:37 + | +2 | inquisition::questions![float { page_size: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/float/plugin.rs b/tests/macros/float/plugin.rs new file mode 100644 index 0000000..5e4b8b7 --- /dev/null +++ b/tests/macros/float/plugin.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![float { plugin: todo!() }]; +} diff --git a/tests/macros/float/plugin.stderr b/tests/macros/float/plugin.stderr new file mode 100644 index 0000000..6486c50 --- /dev/null +++ b/tests/macros/float/plugin.stderr @@ -0,0 +1,5 @@ +error: option `plugin` does not exist for kind `float` + --> $DIR/plugin.rs:2:45 + | +2 | let q = inquisition::questions![float { plugin: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/float/should_loop.rs b/tests/macros/float/should_loop.rs new file mode 100644 index 0000000..89df484 --- /dev/null +++ b/tests/macros/float/should_loop.rs @@ -0,0 +1,5 @@ +fn main() { + inquisition::questions![float { + should_loop: todo!() + }]; +} diff --git a/tests/macros/float/should_loop.stderr b/tests/macros/float/should_loop.stderr new file mode 100644 index 0000000..ccbc8ef --- /dev/null +++ b/tests/macros/float/should_loop.stderr @@ -0,0 +1,5 @@ +error: option `should_loop` does not exist for kind `float` + --> $DIR/should_loop.rs:3:9 + | +3 | should_loop: todo!() + | ^^^^^^^^^^^ diff --git a/tests/macros/float/valid.rs b/tests/macros/float/valid.rs new file mode 100644 index 0000000..9d84c25 --- /dev/null +++ b/tests/macros/float/valid.rs @@ -0,0 +1,14 @@ +fn main() { + inquisition::questions! [ + float { + name: "name", + default: 0.0, + transform: |_, _, _| Ok(()), + async transform: |_, _, _| Box::pin(async { Ok(()) }), + validate: |_, _| Ok(()), + async validate: |_, _| Box::pin(async { Ok(()) }), + filter: |t, _| t, + async filter: |t, _| Box::pin(async move { t }), + } + ]; +} diff --git a/tests/macros/input/choices.rs b/tests/macros/input/choices.rs new file mode 100644 index 0000000..2ffdf22 --- /dev/null +++ b/tests/macros/input/choices.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![input { choices: todo!() }]; +} diff --git a/tests/macros/input/choices.stderr b/tests/macros/input/choices.stderr new file mode 100644 index 0000000..cc253de --- /dev/null +++ b/tests/macros/input/choices.stderr @@ -0,0 +1,5 @@ +error: option `choices` does not exist for kind `input` + --> $DIR/choices.rs:2:37 + | +2 | inquisition::questions![input { choices: todo!() }]; + | ^^^^^^^ diff --git a/tests/macros/input/extension.rs b/tests/macros/input/extension.rs new file mode 100644 index 0000000..92b3a71 --- /dev/null +++ b/tests/macros/input/extension.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![input { extension: todo!() }]; +} diff --git a/tests/macros/input/extension.stderr b/tests/macros/input/extension.stderr new file mode 100644 index 0000000..53fae43 --- /dev/null +++ b/tests/macros/input/extension.stderr @@ -0,0 +1,5 @@ +error: option `extension` does not exist for kind `input` + --> $DIR/extension.rs:2:45 + | +2 | let q = inquisition::questions![input { extension: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/input/mask.rs b/tests/macros/input/mask.rs new file mode 100644 index 0000000..e31614d --- /dev/null +++ b/tests/macros/input/mask.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![input { mask: todo!() }]; +} diff --git a/tests/macros/input/mask.stderr b/tests/macros/input/mask.stderr new file mode 100644 index 0000000..07ca622 --- /dev/null +++ b/tests/macros/input/mask.stderr @@ -0,0 +1,5 @@ +error: option `mask` does not exist for kind `input` + --> $DIR/mask.rs:2:45 + | +2 | let q = inquisition::questions![input { mask: todo!() }]; + | ^^^^ diff --git a/tests/macros/input/page_size.rs b/tests/macros/input/page_size.rs new file mode 100644 index 0000000..e908bff --- /dev/null +++ b/tests/macros/input/page_size.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![input { page_size: todo!() }]; +} diff --git a/tests/macros/input/page_size.stderr b/tests/macros/input/page_size.stderr new file mode 100644 index 0000000..5e91d6f --- /dev/null +++ b/tests/macros/input/page_size.stderr @@ -0,0 +1,5 @@ +error: option `page_size` does not exist for kind `input` + --> $DIR/page_size.rs:2:37 + | +2 | inquisition::questions![input { page_size: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/input/plugin.rs b/tests/macros/input/plugin.rs new file mode 100644 index 0000000..13a5941 --- /dev/null +++ b/tests/macros/input/plugin.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![input { plugin: todo!() }]; +} diff --git a/tests/macros/input/plugin.stderr b/tests/macros/input/plugin.stderr new file mode 100644 index 0000000..3026cad --- /dev/null +++ b/tests/macros/input/plugin.stderr @@ -0,0 +1,5 @@ +error: option `plugin` does not exist for kind `input` + --> $DIR/plugin.rs:2:45 + | +2 | let q = inquisition::questions![input { plugin: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/input/should_loop.rs b/tests/macros/input/should_loop.rs new file mode 100644 index 0000000..121c1c3 --- /dev/null +++ b/tests/macros/input/should_loop.rs @@ -0,0 +1,5 @@ +fn main() { + inquisition::questions![input { + should_loop: todo!() + }]; +} diff --git a/tests/macros/input/should_loop.stderr b/tests/macros/input/should_loop.stderr new file mode 100644 index 0000000..418d91b --- /dev/null +++ b/tests/macros/input/should_loop.stderr @@ -0,0 +1,5 @@ +error: option `should_loop` does not exist for kind `input` + --> $DIR/should_loop.rs:3:9 + | +3 | should_loop: todo!() + | ^^^^^^^^^^^ diff --git a/tests/macros/input/valid.rs b/tests/macros/input/valid.rs new file mode 100644 index 0000000..78057f1 --- /dev/null +++ b/tests/macros/input/valid.rs @@ -0,0 +1,14 @@ +fn main() { + inquisition::questions! [ + input { + name: "name", + default: "hello world", + transform: |_, _, _| Ok(()), + async transform: |_, _, _| Box::pin(async { Ok(()) }), + validate: |_, _| Ok(()), + async validate: |_, _| Box::pin(async { Ok(()) }), + filter: |t, _| t, + async filter: |t, _| Box::pin(async move { t }), + } + ]; +} diff --git a/tests/macros/int/choices.rs b/tests/macros/int/choices.rs new file mode 100644 index 0000000..03bb7b8 --- /dev/null +++ b/tests/macros/int/choices.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![int { choices: todo!() }]; +} diff --git a/tests/macros/int/choices.stderr b/tests/macros/int/choices.stderr new file mode 100644 index 0000000..a4fbf86 --- /dev/null +++ b/tests/macros/int/choices.stderr @@ -0,0 +1,5 @@ +error: option `choices` does not exist for kind `int` + --> $DIR/choices.rs:2:35 + | +2 | inquisition::questions![int { choices: todo!() }]; + | ^^^^^^^ diff --git a/tests/macros/int/extension.rs b/tests/macros/int/extension.rs new file mode 100644 index 0000000..167ee47 --- /dev/null +++ b/tests/macros/int/extension.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![int { extension: todo!() }]; +} diff --git a/tests/macros/int/extension.stderr b/tests/macros/int/extension.stderr new file mode 100644 index 0000000..43373b9 --- /dev/null +++ b/tests/macros/int/extension.stderr @@ -0,0 +1,5 @@ +error: option `extension` does not exist for kind `int` + --> $DIR/extension.rs:2:43 + | +2 | let q = inquisition::questions![int { extension: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/int/mask.rs b/tests/macros/int/mask.rs new file mode 100644 index 0000000..5de9ff2 --- /dev/null +++ b/tests/macros/int/mask.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![int { mask: todo!() }]; +} diff --git a/tests/macros/int/mask.stderr b/tests/macros/int/mask.stderr new file mode 100644 index 0000000..5c13117 --- /dev/null +++ b/tests/macros/int/mask.stderr @@ -0,0 +1,5 @@ +error: option `mask` does not exist for kind `int` + --> $DIR/mask.rs:2:43 + | +2 | let q = inquisition::questions![int { mask: todo!() }]; + | ^^^^ diff --git a/tests/macros/int/page_size.rs b/tests/macros/int/page_size.rs new file mode 100644 index 0000000..6dcf5aa --- /dev/null +++ b/tests/macros/int/page_size.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![int { page_size: todo!() }]; +} diff --git a/tests/macros/int/page_size.stderr b/tests/macros/int/page_size.stderr new file mode 100644 index 0000000..66e631d --- /dev/null +++ b/tests/macros/int/page_size.stderr @@ -0,0 +1,5 @@ +error: option `page_size` does not exist for kind `int` + --> $DIR/page_size.rs:2:35 + | +2 | inquisition::questions![int { page_size: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/int/plugin.rs b/tests/macros/int/plugin.rs new file mode 100644 index 0000000..146911b --- /dev/null +++ b/tests/macros/int/plugin.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![int { plugin: todo!() }]; +} diff --git a/tests/macros/int/plugin.stderr b/tests/macros/int/plugin.stderr new file mode 100644 index 0000000..9f4b2cf --- /dev/null +++ b/tests/macros/int/plugin.stderr @@ -0,0 +1,5 @@ +error: option `plugin` does not exist for kind `int` + --> $DIR/plugin.rs:2:43 + | +2 | let q = inquisition::questions![int { plugin: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/int/should_loop.rs b/tests/macros/int/should_loop.rs new file mode 100644 index 0000000..5f40844 --- /dev/null +++ b/tests/macros/int/should_loop.rs @@ -0,0 +1,5 @@ +fn main() { + inquisition::questions![int { + should_loop: todo!() + }]; +} diff --git a/tests/macros/int/should_loop.stderr b/tests/macros/int/should_loop.stderr new file mode 100644 index 0000000..1878858 --- /dev/null +++ b/tests/macros/int/should_loop.stderr @@ -0,0 +1,5 @@ +error: option `should_loop` does not exist for kind `int` + --> $DIR/should_loop.rs:3:9 + | +3 | should_loop: todo!() + | ^^^^^^^^^^^ diff --git a/tests/macros/int/valid.rs b/tests/macros/int/valid.rs new file mode 100644 index 0000000..9721199 --- /dev/null +++ b/tests/macros/int/valid.rs @@ -0,0 +1,14 @@ +fn main() { + inquisition::questions! [ + int { + name: "name", + default: 0, + transform: |_, _, _| Ok(()), + async transform: |_, _, _| Box::pin(async { Ok(()) }), + validate: |_, _| Ok(()), + async validate: |_, _| Box::pin(async { Ok(()) }), + filter: |t, _| t, + async filter: |t, _| Box::pin(async move { t }), + } + ]; +} diff --git a/tests/macros/list/extension.rs b/tests/macros/list/extension.rs new file mode 100644 index 0000000..6ba4fec --- /dev/null +++ b/tests/macros/list/extension.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![list { extension: todo!() }]; +} diff --git a/tests/macros/list/extension.stderr b/tests/macros/list/extension.stderr new file mode 100644 index 0000000..5c6731b --- /dev/null +++ b/tests/macros/list/extension.stderr @@ -0,0 +1,5 @@ +error: option `extension` does not exist for kind `list` + --> $DIR/extension.rs:2:44 + | +2 | let q = inquisition::questions![list { extension: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/list/filter.rs b/tests/macros/list/filter.rs new file mode 100644 index 0000000..bf03864 --- /dev/null +++ b/tests/macros/list/filter.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![list { filter: todo!() }]; +} diff --git a/tests/macros/list/filter.stderr b/tests/macros/list/filter.stderr new file mode 100644 index 0000000..0410aea --- /dev/null +++ b/tests/macros/list/filter.stderr @@ -0,0 +1,5 @@ +error: option `filter` does not exist for kind `list` + --> $DIR/filter.rs:2:44 + | +2 | let q = inquisition::questions![list { filter: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/list/filter_async.rs b/tests/macros/list/filter_async.rs new file mode 100644 index 0000000..e0ca01f --- /dev/null +++ b/tests/macros/list/filter_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![list { async filter: todo!() }]; +} diff --git a/tests/macros/list/filter_async.stderr b/tests/macros/list/filter_async.stderr new file mode 100644 index 0000000..0e1f568 --- /dev/null +++ b/tests/macros/list/filter_async.stderr @@ -0,0 +1,5 @@ +error: option `filter_async` does not exist for kind `list` + --> $DIR/filter_async.rs:2:50 + | +2 | let q = inquisition::questions![list { async filter: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/list/mask.rs b/tests/macros/list/mask.rs new file mode 100644 index 0000000..37a5044 --- /dev/null +++ b/tests/macros/list/mask.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![list { mask: todo!() }]; +} diff --git a/tests/macros/list/mask.stderr b/tests/macros/list/mask.stderr new file mode 100644 index 0000000..cfc3eb1 --- /dev/null +++ b/tests/macros/list/mask.stderr @@ -0,0 +1,5 @@ +error: option `mask` does not exist for kind `list` + --> $DIR/mask.rs:2:44 + | +2 | let q = inquisition::questions![list { mask: todo!() }]; + | ^^^^ diff --git a/tests/macros/list/plugin.rs b/tests/macros/list/plugin.rs new file mode 100644 index 0000000..b082552 --- /dev/null +++ b/tests/macros/list/plugin.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![list { plugin: todo!() }]; +} diff --git a/tests/macros/list/plugin.stderr b/tests/macros/list/plugin.stderr new file mode 100644 index 0000000..3e4e1cb --- /dev/null +++ b/tests/macros/list/plugin.stderr @@ -0,0 +1,5 @@ +error: option `plugin` does not exist for kind `list` + --> $DIR/plugin.rs:2:44 + | +2 | let q = inquisition::questions![list { plugin: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/list/valid.rs b/tests/macros/list/valid.rs new file mode 100644 index 0000000..ab5dd3f --- /dev/null +++ b/tests/macros/list/valid.rs @@ -0,0 +1,13 @@ +fn main() { + inquisition::questions! [ + list { + name: "name", + default: 0, + transform: |_, _, _| Ok(()), + async transform: |_, _, _| Box::pin(async { Ok(()) }), + choices: ["choice"], + page_size: 0, + should_loop: true, + } + ]; +} diff --git a/tests/macros/list/validate.rs b/tests/macros/list/validate.rs new file mode 100644 index 0000000..545e25a --- /dev/null +++ b/tests/macros/list/validate.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![list { validate: todo!() }]; +} diff --git a/tests/macros/list/validate.stderr b/tests/macros/list/validate.stderr new file mode 100644 index 0000000..3dd37d4 --- /dev/null +++ b/tests/macros/list/validate.stderr @@ -0,0 +1,5 @@ +error: option `validate` does not exist for kind `list` + --> $DIR/validate.rs:2:44 + | +2 | let q = inquisition::questions![list { validate: todo!() }]; + | ^^^^^^^^ diff --git a/tests/macros/list/validate_async.rs b/tests/macros/list/validate_async.rs new file mode 100644 index 0000000..b41b120 --- /dev/null +++ b/tests/macros/list/validate_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![list { async validate: todo!() }]; +} diff --git a/tests/macros/list/validate_async.stderr b/tests/macros/list/validate_async.stderr new file mode 100644 index 0000000..10f0ccd --- /dev/null +++ b/tests/macros/list/validate_async.stderr @@ -0,0 +1,5 @@ +error: option `validate_async` does not exist for kind `list` + --> $DIR/validate_async.rs:2:50 + | +2 | let q = inquisition::questions![list { async validate: todo!() }]; + | ^^^^^^^^ diff --git a/tests/macros/password/choices.rs b/tests/macros/password/choices.rs new file mode 100644 index 0000000..f40f926 --- /dev/null +++ b/tests/macros/password/choices.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![password { choices: todo!() }]; +} diff --git a/tests/macros/password/choices.stderr b/tests/macros/password/choices.stderr new file mode 100644 index 0000000..5a5a4f2 --- /dev/null +++ b/tests/macros/password/choices.stderr @@ -0,0 +1,5 @@ +error: option `choices` does not exist for kind `password` + --> $DIR/choices.rs:2:40 + | +2 | inquisition::questions![password { choices: todo!() }]; + | ^^^^^^^ diff --git a/tests/macros/password/default.rs b/tests/macros/password/default.rs new file mode 100644 index 0000000..b78cf34 --- /dev/null +++ b/tests/macros/password/default.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![password { default: todo!() }]; +} diff --git a/tests/macros/password/default.stderr b/tests/macros/password/default.stderr new file mode 100644 index 0000000..9bbe8e9 --- /dev/null +++ b/tests/macros/password/default.stderr @@ -0,0 +1,5 @@ +error: option `default` does not exist for kind `password` + --> $DIR/default.rs:2:48 + | +2 | let q = inquisition::questions![password { default: todo!() }]; + | ^^^^^^^ diff --git a/tests/macros/password/extension.rs b/tests/macros/password/extension.rs new file mode 100644 index 0000000..1370256 --- /dev/null +++ b/tests/macros/password/extension.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![password { extension: todo!() }]; +} diff --git a/tests/macros/password/extension.stderr b/tests/macros/password/extension.stderr new file mode 100644 index 0000000..447c806 --- /dev/null +++ b/tests/macros/password/extension.stderr @@ -0,0 +1,5 @@ +error: option `extension` does not exist for kind `password` + --> $DIR/extension.rs:2:48 + | +2 | let q = inquisition::questions![password { extension: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/password/page_size.rs b/tests/macros/password/page_size.rs new file mode 100644 index 0000000..6e942a5 --- /dev/null +++ b/tests/macros/password/page_size.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![password { page_size: todo!() }]; +} diff --git a/tests/macros/password/page_size.stderr b/tests/macros/password/page_size.stderr new file mode 100644 index 0000000..4ebf649 --- /dev/null +++ b/tests/macros/password/page_size.stderr @@ -0,0 +1,5 @@ +error: option `page_size` does not exist for kind `password` + --> $DIR/page_size.rs:2:40 + | +2 | inquisition::questions![password { page_size: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/password/plugin.rs b/tests/macros/password/plugin.rs new file mode 100644 index 0000000..3b0f64e --- /dev/null +++ b/tests/macros/password/plugin.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![password { plugin: todo!() }]; +} diff --git a/tests/macros/password/plugin.stderr b/tests/macros/password/plugin.stderr new file mode 100644 index 0000000..f5764dc --- /dev/null +++ b/tests/macros/password/plugin.stderr @@ -0,0 +1,5 @@ +error: option `plugin` does not exist for kind `password` + --> $DIR/plugin.rs:2:48 + | +2 | let q = inquisition::questions![password { plugin: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/password/should_loop.rs b/tests/macros/password/should_loop.rs new file mode 100644 index 0000000..28db8f5 --- /dev/null +++ b/tests/macros/password/should_loop.rs @@ -0,0 +1,5 @@ +fn main() { + inquisition::questions![password { + should_loop: todo!() + }]; +} diff --git a/tests/macros/password/should_loop.stderr b/tests/macros/password/should_loop.stderr new file mode 100644 index 0000000..b16053e --- /dev/null +++ b/tests/macros/password/should_loop.stderr @@ -0,0 +1,5 @@ +error: option `should_loop` does not exist for kind `password` + --> $DIR/should_loop.rs:3:9 + | +3 | should_loop: todo!() + | ^^^^^^^^^^^ diff --git a/tests/macros/password/valid.rs b/tests/macros/password/valid.rs new file mode 100644 index 0000000..dfa9196 --- /dev/null +++ b/tests/macros/password/valid.rs @@ -0,0 +1,14 @@ +fn main() { + inquisition::questions! [ + password { + name: "name", + mask: '*', + transform: |_, _, _| Ok(()), + async transform: |_, _, _| Box::pin(async { Ok(()) }), + validate: |_, _| Ok(()), + async validate: |_, _| Box::pin(async { Ok(()) }), + filter: |t, _| t, + async filter: |t, _| Box::pin(async move { t }), + } + ]; +} diff --git a/tests/macros/plugin/choices.rs b/tests/macros/plugin/choices.rs new file mode 100644 index 0000000..5f7b9db --- /dev/null +++ b/tests/macros/plugin/choices.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![plugin { choices: todo!() }]; +} diff --git a/tests/macros/plugin/choices.stderr b/tests/macros/plugin/choices.stderr new file mode 100644 index 0000000..3387630 --- /dev/null +++ b/tests/macros/plugin/choices.stderr @@ -0,0 +1,5 @@ +error: option `choices` does not exist for kind `plugin` + --> $DIR/choices.rs:2:38 + | +2 | inquisition::questions![plugin { choices: todo!() }]; + | ^^^^^^^ diff --git a/tests/macros/plugin/default.rs b/tests/macros/plugin/default.rs new file mode 100644 index 0000000..6f5844c --- /dev/null +++ b/tests/macros/plugin/default.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![plugin { default: todo!() }]; +} diff --git a/tests/macros/plugin/default.stderr b/tests/macros/plugin/default.stderr new file mode 100644 index 0000000..364c24b --- /dev/null +++ b/tests/macros/plugin/default.stderr @@ -0,0 +1,5 @@ +error: option `default` does not exist for kind `plugin` + --> $DIR/default.rs:2:46 + | +2 | let q = inquisition::questions![plugin { default: todo!() }]; + | ^^^^^^^ diff --git a/tests/macros/plugin/extension.rs b/tests/macros/plugin/extension.rs new file mode 100644 index 0000000..9f6b4cc --- /dev/null +++ b/tests/macros/plugin/extension.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![plugin { extension: todo!() }]; +} diff --git a/tests/macros/plugin/extension.stderr b/tests/macros/plugin/extension.stderr new file mode 100644 index 0000000..d1f9e01 --- /dev/null +++ b/tests/macros/plugin/extension.stderr @@ -0,0 +1,5 @@ +error: option `extension` does not exist for kind `plugin` + --> $DIR/extension.rs:2:46 + | +2 | let q = inquisition::questions![plugin { extension: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/plugin/filter.rs b/tests/macros/plugin/filter.rs new file mode 100644 index 0000000..e731e1e --- /dev/null +++ b/tests/macros/plugin/filter.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![plugin { filter: todo!() }]; +} diff --git a/tests/macros/plugin/filter.stderr b/tests/macros/plugin/filter.stderr new file mode 100644 index 0000000..b149ccc --- /dev/null +++ b/tests/macros/plugin/filter.stderr @@ -0,0 +1,5 @@ +error: option `filter` does not exist for kind `plugin` + --> $DIR/filter.rs:2:46 + | +2 | let q = inquisition::questions![plugin { filter: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/plugin/filter_async.rs b/tests/macros/plugin/filter_async.rs new file mode 100644 index 0000000..dae40db --- /dev/null +++ b/tests/macros/plugin/filter_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![plugin { async filter: todo!() }]; +} diff --git a/tests/macros/plugin/filter_async.stderr b/tests/macros/plugin/filter_async.stderr new file mode 100644 index 0000000..5f825d2 --- /dev/null +++ b/tests/macros/plugin/filter_async.stderr @@ -0,0 +1,5 @@ +error: option `filter_async` does not exist for kind `plugin` + --> $DIR/filter_async.rs:2:52 + | +2 | let q = inquisition::questions![plugin { async filter: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/plugin/mask.rs b/tests/macros/plugin/mask.rs new file mode 100644 index 0000000..cbd9d9d --- /dev/null +++ b/tests/macros/plugin/mask.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![plugin { mask: todo!() }]; +} diff --git a/tests/macros/plugin/mask.stderr b/tests/macros/plugin/mask.stderr new file mode 100644 index 0000000..bab0da2 --- /dev/null +++ b/tests/macros/plugin/mask.stderr @@ -0,0 +1,5 @@ +error: option `mask` does not exist for kind `plugin` + --> $DIR/mask.rs:2:46 + | +2 | let q = inquisition::questions![plugin { mask: todo!() }]; + | ^^^^ diff --git a/tests/macros/plugin/page_size.rs b/tests/macros/plugin/page_size.rs new file mode 100644 index 0000000..7ed6a09 --- /dev/null +++ b/tests/macros/plugin/page_size.rs @@ -0,0 +1,3 @@ +fn main() { + inquisition::questions![plugin { page_size: todo!() }]; +} diff --git a/tests/macros/plugin/page_size.stderr b/tests/macros/plugin/page_size.stderr new file mode 100644 index 0000000..527b024 --- /dev/null +++ b/tests/macros/plugin/page_size.stderr @@ -0,0 +1,5 @@ +error: option `page_size` does not exist for kind `plugin` + --> $DIR/page_size.rs:2:38 + | +2 | inquisition::questions![plugin { page_size: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/plugin/should_loop.rs b/tests/macros/plugin/should_loop.rs new file mode 100644 index 0000000..84dac6b --- /dev/null +++ b/tests/macros/plugin/should_loop.rs @@ -0,0 +1,5 @@ +fn main() { + inquisition::questions![plugin { + should_loop: todo!() + }]; +} diff --git a/tests/macros/plugin/should_loop.stderr b/tests/macros/plugin/should_loop.stderr new file mode 100644 index 0000000..4bf69a5 --- /dev/null +++ b/tests/macros/plugin/should_loop.stderr @@ -0,0 +1,5 @@ +error: option `should_loop` does not exist for kind `plugin` + --> $DIR/should_loop.rs:3:9 + | +3 | should_loop: todo!() + | ^^^^^^^^^^^ diff --git a/tests/macros/plugin/transform.rs b/tests/macros/plugin/transform.rs new file mode 100644 index 0000000..e008ca1 --- /dev/null +++ b/tests/macros/plugin/transform.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![plugin { transform: todo!() }]; +} diff --git a/tests/macros/plugin/transform.stderr b/tests/macros/plugin/transform.stderr new file mode 100644 index 0000000..74c94cd --- /dev/null +++ b/tests/macros/plugin/transform.stderr @@ -0,0 +1,5 @@ +error: option `transform` does not exist for kind `plugin` + --> $DIR/transform.rs:2:46 + | +2 | let q = inquisition::questions![plugin { transform: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/plugin/transform_async.rs b/tests/macros/plugin/transform_async.rs new file mode 100644 index 0000000..3531211 --- /dev/null +++ b/tests/macros/plugin/transform_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![plugin { async transform: todo!() }]; +} diff --git a/tests/macros/plugin/transform_async.stderr b/tests/macros/plugin/transform_async.stderr new file mode 100644 index 0000000..5719fb8 --- /dev/null +++ b/tests/macros/plugin/transform_async.stderr @@ -0,0 +1,5 @@ +error: option `transform_async` does not exist for kind `plugin` + --> $DIR/transform_async.rs:2:52 + | +2 | let q = inquisition::questions![plugin { async transform: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/plugin/valid.rs b/tests/macros/plugin/valid.rs new file mode 100644 index 0000000..51d17dd --- /dev/null +++ b/tests/macros/plugin/valid.rs @@ -0,0 +1,23 @@ +use inquisition::plugin::*; + +#[derive(Debug)] +struct TestPlugin; + +impl inquisition::question::Plugin for TestPlugin { + fn ask( + &mut self, + _message: String, + _answers: &Answers, + _stdout: &mut dyn Backend, + _events: &mut Events, + ) -> inquisition::Result { + Ok(Answer::Int(0)) + } +} + +fn main() { + inquisition::questions![plugin { + name: "name", + plugin: TestPlugin, + }]; +} diff --git a/tests/macros/plugin/validate.rs b/tests/macros/plugin/validate.rs new file mode 100644 index 0000000..9a03f34 --- /dev/null +++ b/tests/macros/plugin/validate.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![plugin { validate: todo!() }]; +} diff --git a/tests/macros/plugin/validate.stderr b/tests/macros/plugin/validate.stderr new file mode 100644 index 0000000..9486637 --- /dev/null +++ b/tests/macros/plugin/validate.stderr @@ -0,0 +1,5 @@ +error: option `validate` does not exist for kind `plugin` + --> $DIR/validate.rs:2:46 + | +2 | let q = inquisition::questions![plugin { validate: todo!() }]; + | ^^^^^^^^ diff --git a/tests/macros/plugin/validate_async.rs b/tests/macros/plugin/validate_async.rs new file mode 100644 index 0000000..65789d9 --- /dev/null +++ b/tests/macros/plugin/validate_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![plugin { async validate: todo!() }]; +} diff --git a/tests/macros/plugin/validate_async.stderr b/tests/macros/plugin/validate_async.stderr new file mode 100644 index 0000000..90c35c0 --- /dev/null +++ b/tests/macros/plugin/validate_async.stderr @@ -0,0 +1,5 @@ +error: option `validate_async` does not exist for kind `plugin` + --> $DIR/validate_async.rs:2:52 + | +2 | let q = inquisition::questions![plugin { async validate: todo!() }]; + | ^^^^^^^^ diff --git a/tests/macros/rawlist/extension.rs b/tests/macros/rawlist/extension.rs new file mode 100644 index 0000000..8d18bc7 --- /dev/null +++ b/tests/macros/rawlist/extension.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![rawlist { extension: todo!() }]; +} diff --git a/tests/macros/rawlist/extension.stderr b/tests/macros/rawlist/extension.stderr new file mode 100644 index 0000000..2d12bcf --- /dev/null +++ b/tests/macros/rawlist/extension.stderr @@ -0,0 +1,5 @@ +error: option `extension` does not exist for kind `rawlist` + --> $DIR/extension.rs:2:47 + | +2 | let q = inquisition::questions![rawlist { extension: todo!() }]; + | ^^^^^^^^^ diff --git a/tests/macros/rawlist/filter.rs b/tests/macros/rawlist/filter.rs new file mode 100644 index 0000000..af722d0 --- /dev/null +++ b/tests/macros/rawlist/filter.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![rawlist { filter: todo!() }]; +} diff --git a/tests/macros/rawlist/filter.stderr b/tests/macros/rawlist/filter.stderr new file mode 100644 index 0000000..90f5039 --- /dev/null +++ b/tests/macros/rawlist/filter.stderr @@ -0,0 +1,5 @@ +error: option `filter` does not exist for kind `rawlist` + --> $DIR/filter.rs:2:47 + | +2 | let q = inquisition::questions![rawlist { filter: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/rawlist/filter_async.rs b/tests/macros/rawlist/filter_async.rs new file mode 100644 index 0000000..2403327 --- /dev/null +++ b/tests/macros/rawlist/filter_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![rawlist { async filter: todo!() }]; +} diff --git a/tests/macros/rawlist/filter_async.stderr b/tests/macros/rawlist/filter_async.stderr new file mode 100644 index 0000000..f0ff095 --- /dev/null +++ b/tests/macros/rawlist/filter_async.stderr @@ -0,0 +1,5 @@ +error: option `filter_async` does not exist for kind `rawlist` + --> $DIR/filter_async.rs:2:53 + | +2 | let q = inquisition::questions![rawlist { async filter: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/rawlist/mask.rs b/tests/macros/rawlist/mask.rs new file mode 100644 index 0000000..092dc18 --- /dev/null +++ b/tests/macros/rawlist/mask.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![rawlist { mask: todo!() }]; +} diff --git a/tests/macros/rawlist/mask.stderr b/tests/macros/rawlist/mask.stderr new file mode 100644 index 0000000..ee2cfaf --- /dev/null +++ b/tests/macros/rawlist/mask.stderr @@ -0,0 +1,5 @@ +error: option `mask` does not exist for kind `rawlist` + --> $DIR/mask.rs:2:47 + | +2 | let q = inquisition::questions![rawlist { mask: todo!() }]; + | ^^^^ diff --git a/tests/macros/rawlist/plugin.rs b/tests/macros/rawlist/plugin.rs new file mode 100644 index 0000000..c31200f --- /dev/null +++ b/tests/macros/rawlist/plugin.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![rawlist { plugin: todo!() }]; +} diff --git a/tests/macros/rawlist/plugin.stderr b/tests/macros/rawlist/plugin.stderr new file mode 100644 index 0000000..3ef66bb --- /dev/null +++ b/tests/macros/rawlist/plugin.stderr @@ -0,0 +1,5 @@ +error: option `plugin` does not exist for kind `rawlist` + --> $DIR/plugin.rs:2:47 + | +2 | let q = inquisition::questions![rawlist { plugin: todo!() }]; + | ^^^^^^ diff --git a/tests/macros/rawlist/valid.rs b/tests/macros/rawlist/valid.rs new file mode 100644 index 0000000..f89342e --- /dev/null +++ b/tests/macros/rawlist/valid.rs @@ -0,0 +1,13 @@ +fn main() { + inquisition::questions! [ + rawlist { + name: "name", + default: 0, + transform: |_, _, _| Ok(()), + async transform: |_, _, _| Box::pin(async { Ok(()) }), + choices: ["choice"], + page_size: 0, + should_loop: true, + } + ]; +} diff --git a/tests/macros/rawlist/validate.rs b/tests/macros/rawlist/validate.rs new file mode 100644 index 0000000..1d9d2a4 --- /dev/null +++ b/tests/macros/rawlist/validate.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![rawlist { validate: todo!() }]; +} diff --git a/tests/macros/rawlist/validate.stderr b/tests/macros/rawlist/validate.stderr new file mode 100644 index 0000000..d6bd45c --- /dev/null +++ b/tests/macros/rawlist/validate.stderr @@ -0,0 +1,5 @@ +error: option `validate` does not exist for kind `rawlist` + --> $DIR/validate.rs:2:47 + | +2 | let q = inquisition::questions![rawlist { validate: todo!() }]; + | ^^^^^^^^ diff --git a/tests/macros/rawlist/validate_async.rs b/tests/macros/rawlist/validate_async.rs new file mode 100644 index 0000000..c70cf1a --- /dev/null +++ b/tests/macros/rawlist/validate_async.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![rawlist { async validate: todo!() }]; +} diff --git a/tests/macros/rawlist/validate_async.stderr b/tests/macros/rawlist/validate_async.stderr new file mode 100644 index 0000000..623050c --- /dev/null +++ b/tests/macros/rawlist/validate_async.stderr @@ -0,0 +1,5 @@ +error: option `validate_async` does not exist for kind `rawlist` + --> $DIR/validate_async.rs:2:53 + | +2 | let q = inquisition::questions![rawlist { async validate: todo!() }]; + | ^^^^^^^^ diff --git a/tests/macros/unknown/async-option.rs b/tests/macros/unknown/async-option.rs new file mode 100644 index 0000000..4503116 --- /dev/null +++ b/tests/macros/unknown/async-option.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![input { async name: 0 }]; +} diff --git a/tests/macros/unknown/async-option.stderr b/tests/macros/unknown/async-option.stderr new file mode 100644 index 0000000..19a0f89 --- /dev/null +++ b/tests/macros/unknown/async-option.stderr @@ -0,0 +1,5 @@ +error: unknown question option `name_async` + --> $DIR/async-option.rs:2:51 + | +2 | let q = inquisition::questions![input { async name: 0 }]; + | ^^^^ diff --git a/tests/macros/unknown/async-unknown.rs b/tests/macros/unknown/async-unknown.rs new file mode 100644 index 0000000..8de9fb2 --- /dev/null +++ b/tests/macros/unknown/async-unknown.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![input { async unknown: 0 }]; +} diff --git a/tests/macros/unknown/async-unknown.stderr b/tests/macros/unknown/async-unknown.stderr new file mode 100644 index 0000000..b3c0648 --- /dev/null +++ b/tests/macros/unknown/async-unknown.stderr @@ -0,0 +1,5 @@ +error: unknown question option `unknown_async` + --> $DIR/async-unknown.rs:2:51 + | +2 | let q = inquisition::questions![input { async unknown: 0 }]; + | ^^^^^^^ diff --git a/tests/macros/unknown/kind.rs b/tests/macros/unknown/kind.rs new file mode 100644 index 0000000..7488244 --- /dev/null +++ b/tests/macros/unknown/kind.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![unknown {}]; +} diff --git a/tests/macros/unknown/kind.stderr b/tests/macros/unknown/kind.stderr new file mode 100644 index 0000000..d8e01cc --- /dev/null +++ b/tests/macros/unknown/kind.stderr @@ -0,0 +1,5 @@ +error: unknown question kind unknown + --> $DIR/kind.rs:2:37 + | +2 | let q = inquisition::questions![unknown {}]; + | ^^^^^^^ diff --git a/tests/macros/unknown/option.rs b/tests/macros/unknown/option.rs new file mode 100644 index 0000000..d779f9b --- /dev/null +++ b/tests/macros/unknown/option.rs @@ -0,0 +1,3 @@ +fn main() { + let q = inquisition::questions![input { unknown: 0 }]; +} diff --git a/tests/macros/unknown/option.stderr b/tests/macros/unknown/option.stderr new file mode 100644 index 0000000..14fd0e4 --- /dev/null +++ b/tests/macros/unknown/option.stderr @@ -0,0 +1,5 @@ +error: unknown question option `unknown` + --> $DIR/option.rs:2:45 + | +2 | let q = inquisition::questions![input { unknown: 0 }]; + | ^^^^^^^