use crate::entity_type::EntityType;
use crate::Configuration;
use std::collections::HashMap;
#[derive(Debug)]
pub struct EntityQuery {
ids: Vec<String>,
lang: String,
}
#[derive(Debug)]
pub struct SearchQuery {
query: String,
lang: String,
search_lang: String,
limit: u64,
entity_type: EntityType,
}
impl EntityQuery {
pub fn new<S: Into<String>>(ids: Vec<String>, lang: S) -> EntityQuery {
Self {
ids,
lang: lang.into(),
}
}
pub fn ids(&self) -> &[String] {
&self.ids
}
pub fn lang(&self) -> &str {
&self.lang
}
pub fn url(&self, configuration: &Configuration) -> String {
let mut params: Vec<String> = self
.params()
.iter()
.map(|(k, v)| k.to_owned() + "=" + v)
.collect();
params.sort(); format!(
"{}?{}&format=json",
configuration.api_url(),
encode_url(¶ms.join("&"))
)
}
pub fn params(&self) -> HashMap<String, String> {
vec![
("action", "wbgetentities"),
("ids", &self.ids_piped()),
("languages", &self.lang),
("uselang", &self.lang),
]
.into_iter()
.map(|s| (s.0.to_string(), s.1.to_string()))
.collect()
}
fn ids_piped(&self) -> String {
self.ids().join("|")
}
}
impl SearchQuery {
pub fn new<S: Into<String>>(
query: S,
lang: S,
search_lang: S,
limit: u64,
entity_type: EntityType,
) -> SearchQuery {
Self {
query: query.into(),
lang: lang.into(),
search_lang: search_lang.into(),
limit,
entity_type,
}
}
pub fn entity_type(&self) -> &EntityType {
&self.entity_type
}
pub fn lang(&self) -> &str {
&self.lang
}
pub fn limit(&self) -> &u64 {
&self.limit
}
pub fn query(&self) -> &str {
&self.query
}
pub fn search_lang(&self) -> &str {
&self.search_lang
}
pub fn url(&self, configuration: &Configuration) -> String {
let mut params: Vec<String> = self
.params()
.iter()
.map(|(k, v)| k.to_owned() + "=" + v)
.collect();
params.sort(); format!(
"{}?{}&format=json",
configuration.api_url(),
encode_url(¶ms.join("&"))
)
}
pub fn params(&self) -> HashMap<String, String> {
vec![
("action", "wbsearchentities"),
("search", &self.query),
("language", &self.search_lang),
("limit", &self.limit.to_string()),
("type", &self.entity_type.string_value()),
("uselang", &self.lang),
]
.into_iter()
.map(|s| (s.0.to_string(), s.1.to_string()))
.collect()
}
}
fn encode_url(url: &str) -> String {
str::replace(url, " ", "%20")
}