From 7738043a80268557b986429c5cc9a56b3d551df7 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Mon, 9 Feb 2026 17:00:22 +0100 Subject: [PATCH] feat: Reporting --- src/api.rs | 33 +++++++++++++++++++++++++++++++++ src/lib.rs | 8 ++++++++ 2 files changed, 41 insertions(+) diff --git a/src/api.rs b/src/api.rs index ba3f9fd..21e59c5 100644 --- a/src/api.rs +++ b/src/api.rs @@ -1,3 +1,5 @@ +use serde::Deserialize; + use crate::models::{ApiResponse, SuplError}; pub fn fetch_api(provider_url: &str) -> Result { @@ -14,3 +16,34 @@ pub fn fetch_api(provider_url: &str) -> Result { reason: e.to_string(), }) } + +#[derive(Deserialize)] +struct StatusResponse { + working: bool, + message: Option, +} + +pub fn test_api(provider_url: &str) -> Result<(), SuplError> { + let trimmed = provider_url.trim_end_matches('/'); + let url = format!("{}/status", trimmed); + + let status: StatusResponse = minreq::get(&url) + .send() + .map_err(|e| SuplError::NetworkError { + reason: e.to_string(), + })? + .json() + .map_err(|e| SuplError::ParseError { + reason: e.to_string(), + })?; + + if status.working { + Ok(()) + } else { + Err(SuplError::ParseError { + reason: status + .message + .unwrap_or_else(|| "Provider reported not working".to_string()), + }) + } +} diff --git a/src/lib.rs b/src/lib.rs index dcac59b..20a0edf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -34,21 +34,29 @@ impl JecnaSuplClient { pub fn get_schedule(&self, class_name: String) -> Result { let provider = self.provider_url.read().unwrap(); + + api::test_api(&provider)?; schedule::get_schedule_impl(&provider, class_name) } pub fn get_teacher_absence(&self) -> Result { let provider = self.provider_url.read().unwrap(); + + api::test_api(&provider)?; teacher_absence::get_teacher_absence_impl(&provider) } pub fn get_all(&self) -> Result { let provider = self.provider_url.read().unwrap(); + + api::test_api(&provider)?; all::get_all_impl(&provider) } pub fn report(&self, content: String, class: String, report_location: ReportLocation) -> Result<(), SuplError> { let provider = self.provider_url.read().unwrap(); + + api::test_api(&provider)?; report_impl(&provider, content, class, report_location) } }