use std::fmt;
use reqwest::Client;
use serde::{Deserialize, Serialize};
use url::Url;
use crate::ddi::client::Error;
use crate::ddi::feedback::Feedback;
#[derive(Debug, Deserialize)]
pub struct Link {
href: String,
}
impl fmt::Display for Link {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.href)
}
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum Execution {
Closed,
Proceeding,
Canceled,
Scheduled,
Rejected,
Resumed,
Downloaded,
Download,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum Finished {
Success,
Failure,
None,
}
pub(crate) async fn send_feedback_internal<T: Serialize>(
client: &Client,
url: &str,
id: &str,
execution: Execution,
finished: Finished,
progress: Option<T>,
details: Vec<&str>,
) -> Result<(), Error> {
let mut url: Url = url.parse()?;
{
let mut paths = url
.path_segments_mut()
.map_err(|_| url::ParseError::SetHostOnCannotBeABaseUrl)?;
paths.push("feedback");
}
url.set_query(None);
let details = details.iter().map(|m| m.to_string()).collect();
let feedback = Feedback::new(id, execution, finished, progress, details);
let reply = client.post(url.to_string()).json(&feedback).send().await?;
reply.error_for_status()?;
Ok(())
}