Files
jecna-supl-client/src/models.rs
2026-02-09 17:11:48 +01:00

130 lines
3.3 KiB
Rust

use serde::Deserialize;
use std::collections::HashMap;
#[derive(Debug, thiserror::Error, uniffi::Error)]
pub enum SuplError {
#[error("Network error: {reason}")]
NetworkError { reason: String },
#[error("Parse error: {reason}")]
ParseError { reason: String },
#[error("Invalid date format: {reason}")]
DateFormatError { reason: String },
#[error("Internal runtime error: {reason}")]
RuntimeError { reason: String },
}
#[derive(Deserialize, Debug, uniffi::Enum, Clone)]
#[serde(tag = "type")]
pub enum AbsenceEntry {
#[serde(rename = "wholeDay")]
WholeDay {
teacher: String,
#[serde(rename = "teacherCode")]
teacher_code: String,
},
#[serde(rename = "single")]
Single {
teacher: String,
#[serde(rename = "teacherCode")]
teacher_code: String,
hours: u16,
},
#[serde(rename = "range")]
Range {
teacher: String,
#[serde(rename = "teacherCode")]
teacher_code: String,
hours: AbsenceRange,
},
#[serde(rename = "exkurze")]
Exkurze {
teacher: String,
#[serde(rename = "teacherCode")]
teacher_code: String,
},
#[serde(rename = "zastoupen")]
Zastoupen {
teacher: String,
#[serde(rename = "teacherCode")]
teacher_code: String,
zastupuje: SubstituteInfo,
},
#[serde(rename = "invalid")]
Invalid { original: String },
}
#[derive(Deserialize, Debug, uniffi::Record, Clone)]
pub struct AbsenceRange {
pub from: u16,
pub to: u16,
}
#[derive(Deserialize, Debug, uniffi::Record, Clone)]
pub struct SubstituteInfo {
pub teacher: String,
#[serde(rename = "teacherCode")]
pub teacher_code: String,
}
#[derive(Deserialize, Debug, uniffi::Record, Clone)]
pub struct ChangeEntry {
pub text: String,
#[serde(rename = "backgroundColor")]
pub background_color: Option<String>,
#[serde(rename = "foregroundColor")]
pub foreground_color: Option<String>,
#[serde(rename = "willBeSpecified")]
pub will_be_specified: Option<bool>,
}
#[derive(Deserialize, Debug, uniffi::Record)]
pub struct ApiResponse {
pub status: Status,
pub schedule: HashMap<String, DailyData>,
}
#[derive(Deserialize, Clone, Debug, uniffi::Record)]
pub struct DailyData {
pub info: DayInfo,
pub changes: HashMap<String, Vec<Option<ChangeEntry>>>,
pub absence: Vec<AbsenceEntry>,
#[serde(rename = "takesPlace")]
pub takes_place: String,
#[serde(rename = "reservedRooms")]
pub reserved_rooms: Vec<Option<String>>,
}
#[derive(Deserialize, Debug, uniffi::Record, Clone)]
pub struct DayInfo {
#[serde(rename = "inWork")]
pub in_work: bool,
}
#[derive(Debug, Deserialize, uniffi::Record, Clone)]
pub struct Status {
#[serde(rename = "lastUpdated")]
pub last_updated: String,
#[serde(rename = "currentUpdateSchedule")]
pub current_update_schedule: u16,
}
#[derive(uniffi::Record)]
pub struct SuplResult {
pub status: Status,
pub schedule: HashMap<String, DailySchedule>,
}
#[derive(uniffi::Record)]
pub struct DailySchedule {
pub info: DayInfo,
pub changes: Vec<Option<ChangeEntry>>,
pub absence: Vec<AbsenceEntry>,
pub takes_place: String,
}
#[derive(uniffi::Record)]
pub struct TeacherAbsenceResult {
pub absences: HashMap<String, Vec<AbsenceEntry>>,
}