use std::{collections::HashMap, error::Error};
use bytes::Bytes;
use chrono::{DateTime, FixedOffset};
use reqwest::header::HeaderMap;
#[cfg(feature = "image")]
use image::DynamicImage;
use crate::get_id;
pub struct BookData {
pub name: String,
pub category: String,
pub date_added: DateTime<FixedOffset>,
pub search_id: String,
pub commit_url: String,
pub commit_author: String,
}
impl BookData {
pub fn from_json(book_dict: HashMap<String, String>) -> BookData {
let name = book_dict.get("name").expect(
"Failed acquiring book name from json!"
).to_owned();
let category = book_dict.get("category").expect(
"Failed acquiring book category from json!"
).to_owned();
let date_added = DateTime::parse_from_str(book_dict.get("date_added").expect(
"Failed acquiring book date added header!"
), "%Y-%m-%d %H:%M:%S%z").expect(
"Failed to convert book's date added header to date time object."
);
let search_id = book_dict.get("search_id").expect(
"Failed acquiring book search id header!"
).to_owned();
let commit_url = book_dict.get("commit_url").expect(
"Failed acquiring book commit url header!"
).to_owned();
let commit_author = book_dict.get("commit_author").expect(
"Failed acquiring book commit author header!"
).to_owned();
Self {
name,
category,
date_added,
search_id,
commit_url,
commit_author
}
}
pub async fn get_book(&self) -> Result<Book, Box<dyn Error>> {
get_id(String::from(&self.search_id)).await
}
}
pub struct Book {
pub details: BookData,
pub raw_bytes: Bytes,
}
impl Book {
pub fn from_response(headers: HeaderMap, bytes: Bytes) -> Book {
let name = headers.get("book-name").expect(
"Failed acquiring book name header!"
).to_str().expect("Failed converting book name to string.").to_owned();
let category = headers.get("book-category").expect(
"Failed acquiring book category header!"
).to_str().expect("Failed converting book category to string.").to_owned();
let date_added = DateTime::parse_from_str(headers.get("book-date-added").expect(
"Failed acquiring book date added header!"
).to_str().expect("Failed converting book date time to string."), "%Y-%m-%d %H:%M:%S%z").expect(
"Failed to convert book's date added header to date time object."
);
let search_id = headers.get("book-search-id").expect(
"Failed acquiring book search id header!"
).to_str().expect("Failed converting book search id to string.").to_owned();
let commit_url = headers.get("book-commit-url").expect(
"Failed acquiring book commit url header!"
).to_str().expect("Failed converting book commit url to string.").to_owned();
let commit_author = headers.get("book-commit-author").expect(
"Failed acquiring book commit author header!"
).to_str().expect("Failed converting book commit author to string.").to_owned();
Self {
details: BookData {
name,
category,
date_added,
search_id,
commit_url,
commit_author
},
raw_bytes: bytes
}
}
#[cfg(feature = "image")]
pub fn to_image(&self) -> DynamicImage {
image::load_from_memory(&self.raw_bytes).expect("Failed to convert bytes into dynamic image object.")
}
}