use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum QuestionStep {
Identifier,
IsMixture,
ComponentCount,
ComponentIdentifier,
ComponentFraction,
PhysicalForm,
SolutionConcentration,
IntendedUse,
OrganicInorganic,
FunctionalGroups,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum Question {
Text {
prompt: String,
example: Option<String>,
},
Choice {
prompt: String,
options: Vec<String>,
},
YesNo {
prompt: String,
},
Number {
prompt: String,
unit: String,
min: f64,
max: f64,
},
MultiChoice {
prompt: String,
options: Vec<String>,
include_unknown: bool,
},
}
impl Question {
pub fn prompt(&self) -> &str {
match self {
Question::Text { prompt, .. } => prompt,
Question::Choice { prompt, .. } => prompt,
Question::YesNo { prompt } => prompt,
Question::Number { prompt, .. } => prompt,
Question::MultiChoice { prompt, .. } => prompt,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum Answer {
Text(String),
Choice(usize),
YesNo(bool),
Number(f64),
MultiChoice(Vec<usize>),
Skip,
}
impl Answer {
pub fn kind_name(&self) -> &'static str {
match self {
Answer::Text(_) => "text",
Answer::Choice(_) => "choice",
Answer::YesNo(_) => "yes_no",
Answer::Number(_) => "number",
Answer::MultiChoice(_) => "multi_choice",
Answer::Skip => "skip",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QAPair {
pub question: Question,
pub answer: Answer,
}
#[derive(Debug)]
pub enum SessionResult {
NeedMoreInfo { next_question: Question },
Ready,
RequiresLlm,
}