use std::collections::HashMap;
use serde::{
Deserialize, Serialize,
de::{IntoDeserializer, value::MapDeserializer},
};
use crate::application::utils::de_with::{
deserialize_f32_string, deserialize_semester_type, deserialize_u32_string,
};
use crate::model::SemesterType;
use wdpe::element::parser::ElementParser;
use wdpe::{
element::{complex::sap_table::FromSapTable, definition::ElementDefinition},
error::{ElementError, WebDynproError},
};
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
pub struct LectureAssessmentResult {
#[serde(rename(deserialize = "년도"))]
year: String,
#[serde(
rename(deserialize = "학기"),
deserialize_with = "deserialize_semester_type"
)]
semester: SemesterType,
#[serde(
rename(deserialize = "과목코드"),
deserialize_with = "deserialize_u32_string"
)]
lecture_code: u32,
#[serde(rename(deserialize = "과목명"))]
lecture_name: String,
#[serde(
rename(deserialize = "학점"),
deserialize_with = "deserialize_f32_string"
)]
points: f32,
#[serde(rename(deserialize = "교수명"))]
professor: String,
#[serde(rename(deserialize = "소속대학"))]
collage: String,
#[serde(rename(deserialize = "소속학과"))]
department: String,
#[serde(rename(deserialize = "직위명"))]
position: String,
#[serde(
rename(deserialize = "점수"),
deserialize_with = "deserialize_f32_string"
)]
score: f32,
}
impl LectureAssessmentResult {
pub fn year(&self) -> &str {
&self.year
}
pub fn semester(&self) -> SemesterType {
self.semester
}
pub fn lecture_code(&self) -> u32 {
self.lecture_code
}
pub fn lecture_name(&self) -> &str {
&self.lecture_name
}
pub fn points(&self) -> f32 {
self.points
}
pub fn professor(&self) -> &str {
&self.professor
}
pub fn collage(&self) -> &str {
&self.collage
}
pub fn department(&self) -> &str {
&self.department
}
pub fn position(&self) -> &str {
&self.position
}
pub fn score(&self) -> f32 {
self.score
}
}
impl<'body> FromSapTable<'body> for LectureAssessmentResult {
fn from_table(
header: Option<&'body wdpe::element::complex::sap_table::SapTableHeader>,
row: &'body wdpe::element::complex::sap_table::SapTableRow,
parser: &'body ElementParser,
) -> Result<Self, WebDynproError> {
let map_string = row.try_row_into::<HashMap<String, String>>(header, parser)?;
let map_de: MapDeserializer<_, serde::de::value::Error> = map_string.into_deserializer();
Ok(
Self::deserialize(map_de).map_err(|e| ElementError::InvalidContent {
element: row.table_def().id().to_string(),
content: e.to_string(),
})?,
)
}
}