pub mod arxiv;
pub mod biorxiv;
pub mod core;
pub mod crossref;
pub mod dblp;
pub mod doaj;
pub mod europepmc;
pub mod hal;
pub mod medrxiv;
pub mod openaire;
pub mod openalex;
pub mod pmc;
pub mod pubmed;
pub mod scholar;
pub mod semantic;
pub mod unpaywall;
pub mod xueshu;
pub mod zenodo;
use serde::Serialize;
pub fn encode_query(query: &str) -> String {
let mut encoded = String::with_capacity(query.len() * 3);
for byte in query.bytes() {
match byte {
b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'_' | b'.' | b'~' => {
encoded.push(byte as char);
}
b' ' => encoded.push('+'),
_ => {
encoded.push('%');
encoded.push_str(&format!("{:02X}", byte));
}
}
}
encoded
}
#[derive(Debug, Clone, Serialize)]
pub struct Paper {
pub id: String,
pub title: String,
pub authors: Vec<String>,
#[serde(rename = "abstract")]
pub abstract_text: Option<String>,
pub year: Option<u16>,
pub doi: Option<String>,
pub url: Option<String>,
pub pdf_url: Option<String>,
pub venue: Option<String>,
pub citations: Option<u32>,
pub fields: Vec<String>,
pub open_access: Option<bool>,
pub source: String,
}