use crate::{error::Result, http::Requester};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::sync::Arc;
#[derive(Debug, Clone, Deserialize, Serialize, canvas_lms_api_derive::CanvasResource)]
pub struct NewQuiz {
pub id: Option<String>,
pub course_id: Option<u64>,
pub title: Option<String>,
pub assignment_id: Option<String>,
pub points_possible: Option<f64>,
pub due_at: Option<String>,
pub lock_at: Option<String>,
pub unlock_at: Option<String>,
pub shuffle_answers: Option<bool>,
pub shuffle_questions: Option<bool>,
pub require_lockdown_browser: Option<bool>,
pub show_correct_answers: Option<bool>,
pub instructions: Option<String>,
pub workflow_state: Option<String>,
#[serde(skip)]
pub(crate) requester: Option<Arc<Requester>>,
}
#[derive(Debug, Default, Clone, Serialize)]
pub struct NewQuizParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub points_possible: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub due_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lock_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unlock_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shuffle_answers: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shuffle_questions: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
}
impl NewQuiz {
fn course_id(&self) -> u64 {
self.course_id.expect("NewQuiz missing course_id")
}
fn quiz_id(&self) -> &str {
self.id.as_deref().expect("NewQuiz missing id")
}
fn endpoint(&self) -> String {
format!("courses/{}/quizzes/{}", self.course_id(), self.quiz_id())
}
pub async fn update(&self, params: NewQuizParams) -> Result<NewQuiz> {
let body = serde_json::to_value(¶ms).unwrap_or_default();
let mut quiz: NewQuiz = self.req().nq_patch(&self.endpoint(), &body).await?;
quiz.requester = self.requester.clone();
Ok(quiz)
}
pub async fn delete(&self) -> Result<NewQuiz> {
let mut quiz: NewQuiz = self.req().nq_delete(&self.endpoint()).await?;
quiz.requester = self.requester.clone();
Ok(quiz)
}
pub async fn set_accommodations(&self, accommodations: Value) -> Result<Value> {
self.req()
.nq_post(
&format!("{}/accommodations", self.endpoint()),
&accommodations,
)
.await
}
}