core_api_client 1.1.0

A Rust library for interacting with CORE API, a service that provides access to metadata and full texts of research papers from thousands of data providers.
Documentation
use serde::{Deserialize, Serialize, de::DeserializeOwned};

use super::response::ApiResponseTrait;

#[derive(Debug, Deserialize, Serialize)]
pub struct SearchResponse<T> {
    
    #[serde(rename = "totalHits")]
    #[serde(deserialize_with = "deserialize_limit")]
    pub total_hits: Option<i32>,

	#[serde(deserialize_with = "deserialize_limit")]
    pub limit: Option<i32>,
	
    #[serde(deserialize_with = "deserialize_limit")]
    pub offset: Option<i32>,
	
    #[serde(rename = "scrollId")]
    pub scroll_id: Option<i32>,

	pub results: Option<Vec<T>>,
    
    pub tooks: Option<String>,
	
    #[serde(rename = "esTook")]
    pub es_took: Option<String>,
}



impl<T: DeserializeOwned> ApiResponseTrait for SearchResponse<T> {}

fn deserialize_limit<'de, D>(deserializer: D) -> Result<Option<i32>, D::Error>
where
    D: serde::Deserializer<'de>,
{
    #[derive(Deserialize)]
    #[serde(untagged)]
    enum IntOrStringOrNull { Int(i32), String(String), Null }

    match IntOrStringOrNull::deserialize(deserializer)? {
        IntOrStringOrNull::Int(i) => Ok(Some(i)),
        IntOrStringOrNull::String(s) => s.parse().map(Some).map_err(serde::de::Error::custom),
        IntOrStringOrNull::Null => Ok(None),
    }
}