use array::Array;
use boolean::Boolean;
use indexmap::IndexMap;
use number::Number;
use object::Object;
use openapiv3::{OpenAPI, Schema, SchemaKind, Type};
use promptuity::Prompt;
use serde_json::Value;
use skippable::Skippable;
use string::StringPrompt;
pub mod array;
pub mod boolean;
pub mod enumeration;
pub(crate) mod error;
pub mod number;
pub mod object;
pub mod skippable;
pub mod string;
pub(crate) mod utils;
pub fn optional_prompt_builder(
api: &OpenAPI,
schema: &Schema,
message: String,
default: Option<IndexMap<String, Value>>,
) -> Box<dyn Prompt<Output = Option<Value>>> {
match &schema.schema_kind {
SchemaKind::Type(Type::Boolean(_)) => Box::new(Skippable::new(Boolean::new(message))),
SchemaKind::Type(Type::String(string)) => Box::new(Skippable::new(StringPrompt::new(
message,
string.clone().into(),
))),
SchemaKind::Type(Type::Number(number)) => {
Box::new(Skippable::new(Number::new(message, number.clone().into())))
}
SchemaKind::Type(Type::Integer(integer)) => {
Box::new(Skippable::new(Number::new(message, integer.clone().into())))
}
SchemaKind::Type(Type::Object(object)) => {
let mut object = Object::new(message, api, object.clone());
if let Some(default) = default {
object.with_value(default);
}
Box::new(Skippable::new(object))
}
SchemaKind::Type(Type::Array(array)) => {
Box::new(Skippable::new(Array::new(message, api, array.clone())))
}
_ => unimplemented!(),
}
}
pub fn prompt_builder(
api: &OpenAPI,
schema: &Schema,
message: String,
default: Option<IndexMap<String, Value>>,
) -> Box<dyn Prompt<Output = Value>> {
match &schema.schema_kind {
SchemaKind::Type(Type::Boolean(_)) => Box::new(Boolean::new(message)),
SchemaKind::Type(Type::String(string)) => {
Box::new(StringPrompt::new(message, string.clone().into()))
}
SchemaKind::Type(Type::Number(number)) => {
Box::new(Number::new(message, number.clone().into()))
}
SchemaKind::Type(Type::Integer(integer)) => {
Box::new(Number::new(message, integer.clone().into()))
}
SchemaKind::Type(Type::Object(object)) => {
let mut object = Object::new(message, api, object.clone());
if let Some(default) = default {
object.with_value(default);
}
Box::new(object)
}
SchemaKind::Type(Type::Array(array)) => Box::new(Array::new(message, api, array.clone())),
_ => unimplemented!(),
}
}