use crate::{Deserialize, Serialize};
use crate::types::enums::IssueFormElementType;
use crate::types::serde_helpers::null_to_default;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IssueTemplate {
pub name: String,
pub about: String,
#[serde(rename = "file_name")]
pub filename: String,
pub title: String,
#[serde(default, deserialize_with = "null_to_default")]
pub labels: Vec<String>,
#[serde(default)]
pub r#ref: String,
#[serde(default, deserialize_with = "null_to_default")]
pub form: Vec<IssueFormElement>,
#[serde(default, rename = "content")]
pub markdown_content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IssueFormElement {
pub id: String,
pub r#type: IssueFormElementType,
pub attributes: IssueFormElementAttributes,
#[serde(default)]
pub validations: IssueFormElementValidations,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IssueFormElementAttributes {
pub label: String,
#[serde(default, deserialize_with = "null_to_default")]
pub options: Vec<String>,
#[serde(default)]
pub value: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub placeholder: String,
#[serde(default, rename = "render")]
pub syntax_highlighting: String,
#[serde(default)]
pub multiple: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct IssueFormElementValidations {
#[serde(default)]
pub required: bool,
#[serde(default, rename = "is_number")]
pub is_number: bool,
#[serde(default)]
pub regex: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_issue_template_round_trip() {
let original = IssueTemplate {
name: "Bug Report".to_string(),
about: "File a bug".to_string(),
filename: "bug_report.md".to_string(),
title: "Bug: ".to_string(),
labels: vec!["bug".to_string()],
r#ref: String::new(),
form: vec![],
markdown_content: "Describe the bug...".to_string(),
};
let json = serde_json::to_string(&original).unwrap();
let restored: IssueTemplate = serde_json::from_str(&json).unwrap();
assert_eq!(restored.name, original.name);
assert_eq!(restored.labels.len(), 1);
assert!(restored.form.is_empty());
}
#[test]
fn test_issue_form_element_round_trip() {
let original = IssueFormElement {
id: "title".to_string(),
r#type: IssueFormElementType::Input,
attributes: IssueFormElementAttributes {
label: "Title".to_string(),
options: vec![],
value: String::new(),
description: "Bug title".to_string(),
placeholder: String::new(),
syntax_highlighting: String::new(),
multiple: false,
},
validations: IssueFormElementValidations {
required: true,
is_number: false,
regex: String::new(),
},
};
let json = serde_json::to_string(&original).unwrap();
let restored: IssueFormElement = serde_json::from_str(&json).unwrap();
assert_eq!(restored.id, "title");
assert!(restored.validations.required);
}
}