use std::sync::Arc;
use serde::{Deserialize, Serialize};
use crate::stela::VisualMotion;
#[derive(Debug, Deserialize, Serialize)]
pub struct SectionForm {
pub header: Option<String>,
pub subheader: Option<String>,
pub inputs: Vec<FormInput>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct FormInput {
pub title: Option<String>,
pub variant: FormInputVariant,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub enum FormInputVariant {
Checkbox(Arc<FormInputCheckbox>),
Image(Arc<FormInputImage>),
Markdown(Arc<FormInputMarkdown>),
Motions(Arc<FormInputMotions>),
Radio(Arc<FormInputRadio>),
Subsection(Arc<FormInputSubsection>),
Text(Arc<FormInputText>),
#[default]
#[serde(other)]
Unknown,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct FormInputSubsection {
pub inputs: Vec<FormInput>,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct FormInputText {
pub name: Option<String>,
pub length_min: Option<i32>,
pub length_max: Option<i32>,
pub esperanto: bool,
pub filter: Option<TextFilter>,
}
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
pub struct TextFilter: u32 {
const ALPHA_ASCII = 1;
const ALPHA_EO = 1 << 1;
const NUMERIC = 1 << 2;
const DASH = 1 << 3;
const UNDERSCORE = 1 << 4;
const PERIOD = 1 << 5;
const SPACE = 1 << 6;
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct FormInputImage {
pub name: Option<String>,
pub preview_style: ImagePreviewStyle,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, Serialize, PartialEq)]
pub enum ImagePreviewStyle {
LargeRectangle,
ThumbnailRect,
ThumbnailCircle,
#[default]
#[serde(other)]
Unknown,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct FormInputMarkdown {
pub name: String,
pub length_min: Option<i32>,
pub length_max: Option<i32>,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct FormInputRadio {
pub name: String,
pub options: Vec<RadioButton>,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct RadioButton {
pub value: String,
pub title: Option<String>,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct FormInputCheckbox {
pub name: String,
pub default_checked: Option<bool>,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct FormInputMotions {
pub vertical_list: Option<bool>,
pub motions: Vec<VisualMotion>,
}